将 WaitOne 与 IPC 的命名互斥体一起使用时,可以有一个空的 while 块吗?

Is it OK to have an empty while block when using WaitOne with named mutexes for IPC?

基本上,同一进程的多个实例将执行此操作:

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();
    }
}

会不会有什么坑? process 可以在不释放互斥量的情况下退出吗?如果发生这种情况,真的会抛出 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 非常危险。发表评论,我将能够帮助您迁移到更好的东西。