簡體   English   中英

單獨線程上的C#UI

[英]C# UI on separate thread

我經常在各種論壇,教程或SO上看到有關在獨立線程上運行UI的建議,然后在程序的其余部分保持UI的響應速度。
在實踐中如何做到這一點? 這是否意味着在加載表單之前編輯program.cs以啟動線程? 還是意味着從表單內部激活的任何非平凡操作都會派生線程並使用該線程? 還是有一些設置? 您如何使用它?

為了使UI保持響應,您應該在單獨的線程中運行其他耗時的操作。 通常,用戶界面操作應在.NET的主(UI)線程中完成。

有幾種方法可以為操作使用單獨的(后台)線程。 對於Windows窗體應用程序,最簡單的選項是BackgroundWorker組件。

您也可以自己創建一個Thread對象。 但是,在調用UI方法或更改創建的線程中的UI控件屬性時,應格外小心。 正如我所說,所有用戶界面操作(顯示表單,更改控件文本或位置等)都應該在UI線程中完成。 否則,您將獲得例外。 為此,可以使用Control.Invoke方法。

通常,在C#WinForms應用程序中,Program.cs會這樣啟動您的主窗體。

Application.Run(new MyMainForm());

這將創建觸發所有事件的主調度程序(GUI)線程,(單擊按鈕,加載表單等)實際上,如果需要執行長時間的計算,則可以創建一個新的后台工作線程並使用該線程。完成更新UI后,調用回事件調度程序。

如果您在UI線程上執行了很長的過程,它將鎖定UI,並且將變得無響應。

UI在主線程上運行。 這個想法是在新線程中運行冗長的操作。 不要在自己的線程中執行每個非平凡的操作,但是任何導致表單“不響應”的事情都是線程的理想選擇。

在C#中,使用BackgroundWorker而不是滾動自己的線程可能是最簡單的。

教程或SO回答了在單獨線程上運行UI的建議 。我對此表示懷疑。 UI始終在自己的線程上運行。 有時它被稱為應用程序的“主”線程。 為避免凍結應用程序,您需要在其他線程中進行CPU密集型工作。 做到這一點的方法很多。 檢出線程,任務,異步和與和。 如果您使用Framework 4.5,則可能會使用await SomeTask功能,只要任務有可能需要20-50毫秒以上的時間才能完成-至少這是MS專家的建議(afaik)

暫無
暫無

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

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