C#中的锁和互斥锁是否应该一起使用

这不是矫枉过正,只有其中一个必要吗?我搜索并在C#herehere中发现了有关互斥和锁定的不同帖子.
例:
在我们的应用程序中,我们有一个旋转多个重新连接线程的函数,在这个线程中我们使用Mutex和一个锁.不会锁定对此段代码的阻止访问,并阻止连接被任何其他线程更新?

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 Garden中运行的ASP.NET WebService中.

最佳答案
Mutex(因为它有一个名字)将停止访问它的同一台机器上的任何进程,而lock只会停止同一进程中的其他线程.我无法从该代码示例中看到为什么您需要两种锁.在短时间内保持简单锁定似乎是一种好习惯 – 但是更重的进程间互斥锁被锁定的时间可能更长(虽然重叠)!使用互斥锁会更简单.也许要找出是否真的需要进程间锁.

顺便说一句,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#中的锁和互斥锁是否应该一起使用 - 代码日志