C# Mutex 需要析构函数吗?

C# does a Mutex need a destructor?

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

因为我从来没有用 Mutex 做过,所以我读了一些教程,现在我用 Mutex 编写了它,并且 MemoryMappedFile 添加到我的应用程序 class 如下所示:

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 class 的 MSDN reference 在示例中添加了析构函数。我的教程没有这样做。

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

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

对我来说,GC 似乎已经在清理,无论是否有终结器。现在我的问题是,那个特定的析构函数的目的到底是什么,是否有必要?

最好始终在使用完 IDisposable 接口后立即释放任何对象。

然而,当您的应用程序(进程)结束时,互斥锁将被操作系统自动销毁,因此实际上,如果您将互斥锁用于应用程序(进程)的整个生命周期。

但是如果您想遵守良好的编码标准并避免代码分析警告,您应该处理它。