在WPF中使用全局互斥锁的正确模式是什么?

时间:2010-05-02 03:43:55

标签: c# wpf mutex

所以我发现了这个信息 What is a good pattern for using a Global Mutex in C#?

但它基于标准应用的主要切入点。 如何修改它以适用于启动应用程序的WPF事件模型?

4 个答案:

答案 0 :(得分:0)

当我第一次回答这个问题时,我读了并写了WPF,但想到了“WCF”。愚蠢的我。这是我的新答案:

如果它必须是真正的全局,请将您的互斥锁设置放在任何使用共享资源之前的任何早期事件中。 Application.Startup可能是你最好的选择。

答案 1 :(得分:0)

您是否要求此创建单实例WPF应用?如果是这样,我建议您查看我在CodePlex上创建的this project。它提供了一个Application派生类,它封装逻辑以创建单实例/多实例感知WPF应用程序,同时处理实例间通信(即主应用程序可以接收传递给后续实例的参数) 。 源代码可用,因此您甚至可以检查是否使用了全局互斥锁和一些WaitHandle来确保同步。

要直接回答您的问题,获取全局互斥锁的正确位置是覆盖Application.Startup方法,因为它在Application.Run的开头(或多或少)被调用方法,可以被认为等同于程序Main(当然它不是同一个东西,但是为了让单个实例应用程序就足够了)。

答案 2 :(得分:0)

看起来最大的问题是,默认情况下调用Startup时,它会在主窗体上调用Show()。

因为这意味着函数返回,将启动调用包含在互斥锁中,就像我链接的原始示例一样,互斥锁上的锁定会在启动后不久发布。如果你改变了Statup打开main从Show()到ShowDialog()的方式,它会按预期工作。

答案 3 :(得分:0)

快速回答:

在App.xaml中:将应用程序更改为InstanceAwareApplication

在App.xaml.cs中:将应用程序更改为InstanceAwareApplication 并覆盖OnStartup(StartupEventArgs e,bool isFirstInstance)

然后按照此处的示例: http://wpfinstanceawareapp.codeplex.com/SourceControl/changeset/view/53538#530411