我正在通過僅僅製作一個WPF應用程序單實例的需求。 但是 - 我必須將命令行傳遞給第一個實例,然後執行一些UI操作。來自其他線程的WPF訪問GUI
我正在使用Mutext檢查已運行的實例,我使用NamedPipes將命令行轉移到已經運行的實例。
但當然,我不是在正確的線程訪問「Window1」。 我嘗試在靜態類中存儲對「Window1」的引用,然後使用Dispatcher在「Window1」中調用方法,但是,只要我嘗試訪問變量(「Window1」中的類範圍廣)I會收到「未設置爲對象實例的對象引用」。
UI操作是爲TabControl添加一個新的Tab - 在新Tab的初始化過程中,一些工作已經完成 - 並且變量被初始化,甚至我想調用的方法在init中工作 - 但是當從調度程序失敗。
任何提示,如何做到這一點?我在這裏錯了嗎?
謝謝!
偉大的信息射線。我之前發佈的解決方案是我遇到的問題,以解決我遇到的問題,並簡單地轉發該信息。我做了一些更多的研究,發現你發佈了同樣的東西(BeginInvoke可能會解決OP的問題)。我對使用lambda表達式而不是回調函數的更多信息感興趣。我使用我在幾個地方發佈的代碼,並且正在考慮改變它,如果有更好的方法。你有什麼鏈接進入更深層次的解釋?再次感謝! – Scott 2010-03-02 20:35:01
@Scott:lambda表達式實際上只是語法糖。我在其他評論中提到的性能差異是什麼讓我們忽略了對Dispatcher.CheckAccess的調用。 Dispatcher.Invoke已經做了Dispatcher.CheckAccess()內部,因此調用Dispatcher.Invoke之前做重複工作和雜波的代碼。當你在同一個線程性能相當於但是當你沒有,的checkAccess()被調用三次,如果我們手動調用它(從調用代碼的調用之前一次,一次,一旦在遞歸調用)。 – 2010-03-02 22:46:00
再次感謝您的回覆!這非常有趣!我發現的所有文章(包括msdn)都建議添加Dispatcher.CheckAccess以防止不必要的調用(請參閱鏈接)。我不打算懷疑,但我希望你能指點我一些文件。感謝您分享您的知識! 鏈接: http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.checkaccess(VS.100).aspx http://social.msdn.microsoft.com/論壇/ EN-US/WPF /線程/ 14f7ca5e-fb1c-433E-94d4-269c3ddcedec http://blog.decarufel.net/2009/03/good-practice-to-use-dispatcher-in-wpf.html – Scott 2010-03-02 23:41:02