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

标签 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 
    {
        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/

相关文章:

c# - 为什么 C# 编译器无法检测到 this 不能为 null?

c# - WPF 中类似 Google map 的滚动面板

C++ 识别像素中的二级和三级显示器

java - 在运行窗口中调用命令

c# - 如何在最后一个列表中插入元素?

c# - Convert.ToDecimal 在加载 DirectX/Direct3D 时给出不同的结果

c# - 如何检查datagridview不为空?

.NET正则表达式允许3个重复字符

.net - 多次调用 string.Replace() 是否比一次调用 .NET 中的 Regex 方法效率低?

windows - 在新终端中运行命令,稍后终止