gpt4 book ai didi

c# - C# 中的 Locks 和 Mutexes 应该一起使用吗

转载 作者:太空狗 更新时间:2023-10-29 18:14:35 24 4
gpt4 key购买 nike

这会不会有点矫枉过正,而且只是其中一个必要条件?我搜索并找到了有关 C# 中的互斥和锁的不同帖子 herehere .

示例:
在我们的应用程序中,我们有一个函数可以分离多个重新连接线程,在这个线程中我们使用了一个 Mutex 和一个 locklock 不会阻止对这部分代码的访问并防止 connect 被任何其他线程更新吗?

bool connect = false;
Mutex reconnectMutex = new Mutex(false, "Reconnect_" + key);

try
{
lock(site)
{
if(site.ContainsKey(key))
{
siteInfo = (SiteInfo)site[key];
if(reconnectMutex.WaitOne(100, true))
{
connect = true;
}
}
}

if (connect)
{
// Process thread logic
}
}
catch
{}

reconnectMutex.ReleaseMutex();

更多信息:
这是在不在 Web 园中运行的 ASP.NET WebService 中。

最佳答案

那个 Mutex(因为它有一个名字)也会停止同一台机器上访问它的任何进程,而锁只会停止同一进程中的其他线程。从该代码示例中我看不出为什么您需要两种锁。在短时间内持有简单锁似乎是一种很好的做法 - 但随后更重的进程间互斥体被锁定了可能更长(尽管重叠)的时间!只使用互斥锁会更简单。或许还可以查明进程间锁是否真的有必要。

顺便说一句,catch {} 在这种情况下绝对是错误的使用方法。你应该使用 finally {/* release mutex */}。他们非常不同。 catch 将吞下比它应有的更多种类的异常,并且还会导致嵌套的 finally 处理程序执行以响应低级异常,例如内存损坏、访问冲突等。因此,而不是:

try
{
// something
}
catch
{}

// cleanup

你应该:

try
{
// something
}
finally
{
// cleanup
}

如果有特定的异常你可以从中恢复,你可以捕获它们:

try
{
// something
}
catch (DatabaseConfigurationError x)
{
// tell the user to configure the database properly
}
finally
{
// cleanup
}

关于c# - C# 中的 Locks 和 Mutexes 应该一起使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/643170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com