我對此需要超過幾秒鐘來完成更多的多個操作的類。在此期間,我想更新UI。所以BackgroundWorker通常是最好的選擇。但由於某種原因,BackGroundWorker並不總是以我想要的方式工作(例如:當我嘗試對事件使用WebBrowser並調用ReportProgress事件時,BackgroundWorker看起來崩潰)。
因此,我通過將Ui從主線程分離來避免所有這些。
此僞更好地解釋它:
public Ui ui;
main
{
Thread threadUi = new Thread(initiateUi);
//Initiate and start Thread
//Everything I will do from here on will not have any consequences
//on my ui.
//
//Object Ui can still be publicly accessed, making it possible to
//update the user interface.
}
現在,當我有Bar類的一個實例,我將使它的UI這樣的訪問:
public Bar bar1;
public Bar bar2;
main
{
//
//other stuff here
//
Thread threadBar1 = //New Thread where I call the Bar initializer function
//and pass bar1 as parameter.
Thread threadBar2 = //idem dito, except with bar2 as parameter
//
//other stuff here
//
}
有了這個設計,我可以打電話bar1和bar2從我的用戶界面使用以下功能:
Program.bar1.someFunction();
問題:
現在讓我們說我有一個名爲FooHandler的類。該類有一個函數,用於在某個FooDepository中搜索Foo的所有實例,以及其他函數來操縱Foo對象。這是一個靜態類,因爲在我的情況下,它不需要有多個實例。
但是,如果我要從FooHandler調用一個函數,該函數將在我的UI線程中運行,因爲這是調用線程(我不太確定,但我找不到有關此主題的任何文檔)。所以我很有可能面臨我開始的問題。
問題:
是否有可能訪問靜態類的功能,而無需使用來自調用線程的處理能力?
我正在使用.Net 4.0。所以我會研究這個Task對象。 編輯:哇!使用任務就像下面這樣簡單: 任務t =新任務(new Action(()=> {FooHandler.someFunction();}));? – Jordy
是的,這很容易:)很高興幫助。請使用通用版本的任務,然後你可以做t.Result(這將阻止線程,所以要小心)返回你的類型。此外,您不需要執行新的操作,下面是一個示例:任務 task = new任務(()=> FooHandler.someFunctionThatReturnsString()); –