簡體   English   中英

c#2.0中的UI凍結問題

[英]UI freezing problem in c# 2.0

有時我看到當我從我的表單中調用一個方法來執行某些操作時,我的UI會凍結。 如何解決這個問題呢? 如果我在單獨的線程中調用該方法,那么問題將會解決嗎?

如果我在單獨的線程中調用方法,如下面的代碼

new System.Threading.Thread(delegate()
{
  HeavyMethod();
}).Start();

這會解決我的問題還是有更好的解決方案?

在Background Worker上調用方法將是最佳解決方案。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

這樣做可以控制事情何時更新(使用報告進度功能)並允許您取消工作。

此外,請確保您在backgroundWorker1.RunWorkerAsync();操作的任何資源backgroundWorker1.RunWorkerAsync(); 正確分享。 您可以進入所謂的“競爭條件”,這會導致您的輸出非威懾(例如,每次運行該方法時,您都不會得到相同的結果)

有關多線程和共享資源的詳細信息,請參閱此鏈接: http ://www.c-sharpcorner.com/uploadfile/mgold/multithreadingintro10062005000439am/multithreadingintro.aspx?articleid = 910ecafc-e83b-4a9c-a64d-0b39ad885705

如果要響應事件調用方法,則默認情況下該方法將在GUI線程上運行(運行時用於處理所有用戶事件的線程)。 如果該方法很大和/或很重,那么它將按照您的描述“凍結”UI。

使其在單獨的線程上運行許多這些情況的可行解決方案。

但是,有些情況下,當您真正希望UI“阻止”時(例如,如果您要更新許多控件,則不希望用戶同時使用它們)。 對於這種情況,最安全的方法是彈出模態 “等待”對話框。

因為它是C#2.0,我想它是WinForms。 不要用CPU綁定的代碼來阻止UI線程。

您可以生成一個新線程來運行CPU綁定代碼,但是必須注意不要訪問WinForms控件,尤其是不要更新控件屬性。 許多WinForms控件只能從UI線程訪問/更新。 檢查InvokeRequired字段以查看是否需要將來自另一個線程的調用編組(即使用Invoke)返回到UI線程。

還要考慮使用ThreadPool而不是創建新線程。

這是正確的,如果您將重處理移出UI線程,那么它應該釋放UI以重繪。 對於你想要做的事,你的實現應該可以正常工作。 雖然ThreadPooling或BackgroundWorker是建議的實現(http://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=VS.80).aspx),(http://msdn.microsoft .COM / EN-US /庫/ system.componentmodel.backgroundworker.aspx)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM