所以我发现了这个信息 What is a good pattern for using a Global Mutex in C#?
但它基于标准应用的主要切入点。 如何修改它以适用于启动应用程序的WPF事件模型?
答案 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