c# - Mutex - TryOpenExisting 与新的

标签 c# multithreading concurrency mutex

我正在考虑互斥体,我需要对它们进行一些说明。我应该尝试打开现有的 Mutex 还是创建新的(当然两者名称相同)。代码示例:

第一次尝试 - 尝试打开现有的:

private void AttemptOne()
{
    Mutex myMutex;
    if (!Mutex.TryOpenExisting("Mutex Name", out myMutex))
        myMutex = new Mutex(false, "Mutex Name");
    try
    {
        myMutex.WaitOne(3000);
        // code
    }
    catch { }
    finally
    {
        myMutex.ReleaseMutex();
        // myMutex.Dispose(); - should I call that or it will be called automatically when returning from method?
    }
}

第二次尝试 - 创建新的 Mutex:

private void AttemptTwo()
{
    using (Mutex mutex = new Mutex(false, "Mutex Name"))
    {
        try
        {
            mutex.WaitOne(3000);
            // code
        }
        catch { }
        finally { myMutex.ReleaseMutex(); }
    }
}

我有一些问题,困扰着我:

  • 尝试使用哪个?

    假设我有一个创建了 Mutex 的后台进程,同时主进程尝试做一些工作,这应该被阻止直到 backgorund 进程完成。如果后台进程创建了自己的 Mutex,我应该尝试打开它吗?

    或者在主线程中创建新的同名互斥体?

    这些尝试之间有什么区别?

  • 我应该在第一次尝试时调用 Dispose() 吗?

    或者只是假设 Mutex 将在方法返回时被释放?到时候会处理掉吗?

  • 我假设在第二次尝试中,Mutex 将在 using() 结束时被处置(作为其 IDisposable)。我说得对吗?

最佳答案

如果您打算创建互斥量(如果互斥量根本不存在),那么请继续使用第二种方法。 如果您要基于互斥体的存在而采取不同的行为,那么您应该使用 TryOpenExisting 来检查它是否存在。

关于您的其他问题: 是的,您应该在使用完互斥锁后调用 DisposeClose 方法。为了让操作系统在不使用时销毁它。

是的,使用会调用Mutex对象的Dispose方法。

关于c# - Mutex - TryOpenExisting 与新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740382/

相关文章:

python - python 中的多线程 : is it really performance effiicient most of the time?

c# - 为什么拆分不在 UI 线程上运行的任务以使 WPF 应用程序更具响应性?

windows - 如何在 Windows 中等待进程完成?

ruby - 并发::Promise.all?不起作用

c# - 使用 EF changetracker 手动获取更改集?

c# - .NET C# 逻辑函数,循环函数

c# - 如何连接000webhost中的mysql?

c# - Visual Studio 2012 MVC 构建错误 : The type or namespace name 'Infrastructure' does not exist in the namespace 'System.Data.Entity'

java - LinkedBlockingQueue 在生产者-消费者场景中具有许多生产者的线程安全性

java - 从两台服务器并发访问同一个表