当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#中的锁和互斥锁是否应该一起使用》经验,为你挑选了1个好方法。

这不是矫枉过正,只有其中一个必要吗?我在这里和这里搜索并发现了关于互斥和锁定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();

更多信息:
这是在未在Web Garden中运行的ASP.NET WebService中.



1> Daniel Earwi..:

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
}

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有