C#做Mutex需要一个析构函数吗?

时间:2017-01-18 07:13:46

标签: c# wpf mutex destructor

我正在编写一个WPF应用程序,它注册了一个url方案,该方案基本上将命令行参数传递给应用程序。现在的想法是只启动应用程序一次,如果单击其他链接,第一个启动的应用程序应该评估命令行。

由于我从未使用过Mutex,我已经阅读了一些教程,现在我已经用MutexMemoryMappedFile编写了它,并添加到我的App类中,如下所示: / p>

public partial class App : Application
{
    Mutex m_Mutex;
    MemoryMappedFile m_File;

    protected override void OnStartup(StartupEventArgs e)
    {
         bool mutexCreated;
         Assembly assembly = Assembly.GetExecutingAssembly();
         string mutexName = $"local_{ assembly.GetType().GUID }";

         m_Mutex = new Mutex(true, mutexName, out mutexCreated);
         // Use user32.dll RegisterWindowMessage() to register a Message for the app.

         m_File = MemoryMappedFile.CreateOrOpen($"{mutexName}_mappedData", /* Other Parameters like Security Settings etc. */ );

         if(!mutexCreated)
         {
             m_Mutex = null;
             m_File = null;
             // Use user32.dll PostMessage() to broadcast to all Apps.
             App.Current.Shutdown();
         }
         else
         {
             this.MainWindow = new MainWindow();
             this.MainWindow.Show();
         }
    }
}

这现在可以正常工作,我可以使用PostMessage广播在应用程序之间轻松传递数据。

现在Mutex类的MSDN reference在示例中添加了Destructor。我的教程没有这样做。

~App()
{
    m_Mutex?.Dispose();
    m_File?.Dispose();
}

我现在尝试使用和不使用析构函数进行编译 - 甚至故意使应用程序崩溃,但我没有看到任何区别。在应用程序的基本实例崩溃后,Windows似乎已经处理掉了Mutex。当我再次启动应用程序时,它确实创建了一个新的Mutex,应用程序启动了新窗口。任何进一步的应用程序启动都正确地引用了Mutex并将消息传递到新窗口。

对我而言,似乎GC已经在清理,无论是否有终结器。现在我的问题是,具体的析构函数的目的究竟是什么,是否有必要?

1 个答案:

答案 0 :(得分:2)

最好在完成使用后立即处置实现IDisposable接口的任何对象。

然而,当您的应用程序(进程)结束时,操作系统会自动销毁互斥锁​​,因此在实际操作中,如果您在整个生命周期内使用互斥锁,是否实际处理了互斥锁并没有多大区别您的申请(流程)。

但是,如果您想遵守良好的编码标准并避免代码分析警告,则应将其丢弃。