这不是矫枉过正,只有其中一个必要吗?我在这里和这里搜索并发现了关于互斥和锁定C#的不同帖子.
示例:
在我们的应用程序中,我们有一个旋转多个重新连接线程的函数,在这个线程中我们使用a Mutex和a lock.是否会lock阻止访问此部分代码并阻止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();
Run Code Online (Sandbox Code Playgroud)
更多信息:
这是在未在Web Garden中运行的ASP.NET WebService中.
Dan*_*ker 11
Mutex(因为它有一个名字)将停止访问它的同一台机器上的任何进程,而lock只会停止同一进程中的其他线程.我无法从该代码示例中看到为什么您需要这两种锁.在短时间内保持简单锁定似乎是一种好习惯 - 但是更重的进程间互斥锁被锁定的时间可能更长(虽然重叠)!使用互斥锁会更简单.也许要找出是否真的需要进程间锁.
顺便说一句,catch {}在这种情况下使用绝对是错误的.你应该用finally { /* release mutex */ }.他们是非常不同的.catch会吞下更多种类的异常,并且还会导致嵌套的finally处理程序执行以响应低级异常,例如内存损坏,访问冲突等.所以代替:
try
{
// something
}
catch
{}
// cleanup
Run Code Online (Sandbox Code Playgroud)
你应该有:
try
{
// something
}
finally
{
// cleanup
}
Run Code Online (Sandbox Code Playgroud)
如果您可以从中恢复特定的例外,您可以捕获它们:
try
{
// something
}
catch (DatabaseConfigurationError x)
{
// tell the user to configure the database properly
}
finally
{
// cleanup
}
Run Code Online (Sandbox Code Playgroud)