基本上,同一进程的多个实例将执行此操作:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ }
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
会不会有什么陷阱?进程可以在不释放互斥锁的情况下退出吗?如果发生这种情况,实际上会抛出 AbandonedMutexException
吗?或者另一个进程会获取互斥体吗?还有别的吗?
编辑:
看起来正确的方法应该是(至少我的情况)是这样做:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
bool lockObtained = false;
while (!lockObtained)
{
try
{
while (!mutex.WaitOne()) { /* wait to acquire mutex */ }
lockObtained = true;
}
catch (AbandonedMutexException ignored)
{
// mutex abandoned by another
// process before that process completed.
// We can now try to obtain it again.
}
}
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
最佳答案
这有什么意义?只需等待,无需超时。
当进程退出时,所有资源都会被清理。必须假设 AbandonedMutexException
能够在 IPC 场景中发生,因为其他进程可能随时失败(由于错误或内存不足等)。
如果您这样做是为了使 Thread.Abort
正常工作:Thread.Abort
非常危险。发表评论,我将能够帮助您迁移到更好的东西。
关于c# - 将 WaitOne 与 IPC 命名互斥体一起使用时,可以有一个空的 while block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099105/