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