我正在编写一个WPF应用程序,它注册了一个url方案,该方案基本上将命令行参数传递给应用程序。现在的想法是只启动应用程序一次,如果单击其他链接,第一个启动的应用程序应该评估命令行。
由于我从未使用过Mutex,我已经阅读了一些教程,现在我已经用Mutex
和MemoryMappedFile
编写了它,并添加到我的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已经在清理,无论是否有终结器。现在我的问题是,具体的析构函数的目的究竟是什么,是否有必要?
答案 0 :(得分:2)
最好在完成使用后立即处置实现IDisposable
接口的任何对象。
然而,当您的应用程序(进程)结束时,操作系统会自动销毁互斥锁,因此在实际操作中,如果您在整个生命周期内使用互斥锁,是否实际处理了互斥锁并没有多大区别您的申请(流程)。
但是,如果您想遵守良好的编码标准并避免代码分析警告,则应将其丢弃。