I have the following code:
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run at the same time in another process
}
}
我在if
块内设置了一个断点,并在另一个Visual Studio实例中运行了相同的代码。如预期,.WaitOne
调用会阻塞。然而,出乎意料的是,当我在第一实例中继续并且using
块终止时,第二个进程会抛出关于未释放Mutex的异常。
解决方法是调用ReleaseMutex
:
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run twice in multiple processes
}
mut.ReleaseMutex();
}
现在,事情按照预期进行。
我的问题是:通常,IDisposable的作用是清除您设置的任何状态。我可以看到在using块内有多个等待和释放,但是当处理Mutex的句柄被处理时,它不应该自动释放吗?换句话说,在using块中,如果处理Mutex的句柄被处理,为什么还需要调用ReleaseMutex?我现在也担心,如果if块内的代码崩溃,那么会有未释放的mutex。
将Mutex放入using块中是否有任何好处?或者,我只需新建一个Mutex实例,将其包装在try / catch中,并在finally块中调用ReleaseMutex()(基本上实现了我认为Dispose()会做的事情)?
using
的目的只是在结束时调用Dispose
。它被转换为try{ //yourcode } finally { yourobj.Dispose() }
... 如果你需要更多的逻辑(比如在这种情况下释放),你需要自己管理。 - pollirrata