2009-02-22 24 views
4

如何保持我的C#表單,讓我們說是在for循環,從鎖定?我打電話給Application.DoEvents();在循環之前或之後?從我聽到的使用DoEvents方法會阻止我的應用程序鎖定。Application.DoEvents();

回答

11

您不應該使用Application.DoEvents()以保持應用程序的響應。

調用此方法將允許任何等待的窗口消息被分派。這意味着如果用戶點擊一個按鈕(或執行任何其他用戶交互),該操作將被處理。這可能會導致重入。如果他們按下與正在處理的循環相同的按鈕,則在完成之前,您將最終再次調用例程!

相反,您應該使用BackgroundWorker線程來執行較長的過程,然後一旦完成操作就執行所需的任何其他操作。例如,一旦按下按鈕,您將啓動工作線程,然後禁用您的按鈕,因此無法再次按下按鈕。一旦工作線程完成,您將再次啓用該按鈕。

1

有幾種方法,這(DoEvents)只是強制消息泵來處理消息。有些人在一個線程中將一個Thread.Sleep放在循環的最後(總是在循環內)。你究竟在做什麼,因爲可能有更好的方法來完成你的目標?

1

如果該過程導致鎖死爲不可接受的時間量的用戶界面中,嘗試使用一個單獨的線程(或者創建它,使用線程池,或者使用BackgroundWorker類。

相關問題