2008-11-11 61 views

回答

15

不叫的DoEvents。當你是控制事件循環的應用程序時,這足夠簡單;從一個DLL中抽取消息只會增加你最終會碰到代碼的風險,一個天真的程序員不能再次進入安全環境。

+0

我完全同意。 – 2008-11-12 08:19:58

+0

我同意DoEvents不被使用。但是,如果導致問題的DoEvents來自您沒有源代碼的第三方DLL,該怎麼辦?我已經在我的應用程序重繪問題惡夢,我懷疑它,因爲控件調用的DoEvents和我的主要應用循環最終被代理到控制,因此只要不顯示控制,我的整個應用程序不能正常重繪。 – 2009-05-21 01:42:21

3

你的意思是System.Windows.Forms.Application.DoEvents()

0

寫的EXE一個接口,讓你的主窗體或主類實現它。 然後註冊該對象實現與DLL的接口。 將其分配給該接口類型 的變量做一個子程序是整個DLL可見。 在Subroutine中檢查變量是否爲空,如果不是則調用您創建的方法觸發DoEvents的子例程。 任何時候你需要做一個DoEvents,然後調用子程序。

如果您的應用程序使用三層組織,請在表示整個應用程序的對象上放置子例程或變量。將表單註冊到Application對象中。

如果你有重入問題,你可以添加狀態變量和其他幫助函數來安全地檢查應用程序正在做什麼。請注意,如果您使用某種類型的多層設計,則實現此功能要容易得多。

對於其他尋找這個再入侵是一個問題,但是,這是一個非響應的用戶界面。在複雜的應用程序中,有些情況下您必須讓事件循環啓動。

2

我會迴應「不要」(無論是從DLL或UI項目)。有幾件事情可以使圖書館代碼與UI良好地發揮作用,包括您可能從UI中使用的相同的線程技巧(包括事件和/或回調)。最簡單的方法是庫代碼簡單地執行「原樣」,而如果用戶界面發生產卵它在一個工作線程,那麼它是UI的工作,處理任何事件和他們(Control.Invoke/BeginInvoke)元帥的UI線程UI更新。

對於更復雜的場景,您可以使用同步上下文(SynchronizationContext.Current)將消息發佈到UI線程(實際上這是如何工作的,但它是獨立於實現的 - 所以WPF同步上下文可以通過WPF調度員)。

你能在場景就是加入更多內容?有很多事情可以做...