Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IPC中使用带命名互斥体的WaitOne时,可以使用空while块吗?_C#_.net_Windows_Multithreading_Ipc - Fatal编程技术网

C# 在IPC中使用带命名互斥体的WaitOne时,可以使用空while块吗?

C# 在IPC中使用带命名互斥体的WaitOne时,可以使用空while块吗?,c#,.net,windows,multithreading,ipc,C#,.net,Windows,Multithreading,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 {

基本上,同一流程的多个实例将执行以下操作:

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();
    }
}
会不会有陷阱?进程是否可以在不释放互斥锁的情况下退出?如果发生这种情况,
放弃的mutexception
会实际抛出吗?或者另一个进程只是获取互斥锁?还有别的吗

编辑: 看起来正确的方法应该是(至少在我的场景中)这样做:

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

这有什么意义?只需等待,无需超时

当进程退出时,所有资源都将被清理。必须假设在IPC场景中能够发生
放弃的MutexException
,因为其他进程可能随时失败(由于错误或内存不足等原因)


如果您这样做是因为
Thread.Abort
工作:
Thread.Abort
非常危险。请留下评论,我将能够帮助您迁移到更好的位置。

如果您的线程可以等待足够的时间,您可以调用将系统资源分配给另一个线程。