所以我發現這個信息 What is a good pattern for using a Global Mutex in C#?什麼是在WPF中使用全局互斥鎖的正確模式?
但它是基於標準的應用程序的主入口點。 你如何修改這個以適用於啓動應用程序的WPF事件模型?
所以我發現這個信息 What is a good pattern for using a Global Mutex in C#?什麼是在WPF中使用全局互斥鎖的正確模式?
但它是基於標準的應用程序的主入口點。 你如何修改這個以適用於啓動應用程序的WPF事件模型?
看起來像一個大問題是,當默認調用Startup時,它會在主窗體上調用Show()。
因爲這意味着函數返回,所以像啓動鏈接的原始示例一樣將Startup調用包裝在互斥體中,互斥鎖就會在啓動後不久發佈。如果你改變Statup從Show()向ShowDialog()打開主體的方式,它可以按預期工作。
當我第一次回答這個問題時,我閱讀並寫了WPF,但認爲「WCF」。愚蠢的我。這是我的新答案:
如果它必須是真正的全局性,請在任何使用共享資源之前的早期事件中設置互斥體設置。 Application.Startup
可能是你最好的選擇。
你問這個創建一個單實例WPF應用程序?如果是這樣,我鼓勵你看看我在CodePlex上創建的this project。它提供了一個Application
派生類,它包含了創建單實例/多實例感知WPF應用程序的邏輯,也處理實例間通信(即主應用程序可以接收傳遞給後續實例的參數)。 源代碼可用,因此您甚至可以檢查是否使用了全局互斥鎖和一些WaitHandle來確保同步。
要直接回答您的問題,獲取全局互斥量的適當位置在Application.Startup
方法的覆蓋範圍內,因爲它在方法的開頭(或多或少)被調用,這可以被認爲是等價的到程序Main
(當然,它不是一回事,但爲了讓單個實例應用程序就足夠了)。
快速回答:
在App.xaml中:改變應用程序InstanceAwareApplication
在App.xaml.cs:改變應用程序InstanceAwareApplication 並覆蓋OnStartup(StartupEventArgs E,布爾isFirstInstance)
然後按照這裏的示例: http://wpfinstanceawareapp.codeplex.com/SourceControl/changeset/view/53538#530411