[英]c# calling backgroundWorker from another thread than UI thread
我正在嘗試像下面的代碼一樣加載loadingForm
。 但它不起作用,loadForm不會消失, RunWorkerCompleted
事件不會被調用。
而且,我需要多次調用loadingForm
和backgroundWorker
,那么如何在每次調用后完全處理loadingForm
和backgroundWorker
?
我認為我的代碼中有很多問題,但我不知道如何修復它。 你能告訴我如何解決我的問題並指出我需要修復的地方嗎? 非常感謝提前。
public partial class loginForm : Form
{
//....
private loadingForm lf;
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
lf.Show();
While (backgroundWorker1.isBusy)
Application.DoEvents();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, DoWorkEventArgs e)
{
lf.Close();
}
private void connect()
{
//....
Thread mainThread = new Thread(ThreadStart(listentoServer));
mainThread.Start();
}
private void listentoServer()
{
//....
lf = new loadingForm();
backgroundWorker1.RunWorkerAsync();
//....
backgroundWorker1.CancelAsync();
//....
}
}
你的代碼有很多問題。 如果可以,請嘗試后退並描述您想要做什么。
BackgroundWorker
使用基於事件的異步模式(EAP)。 因此,它需要一個生存的線程上下文。 UI線程滿足此要求,但手動創建的Thread
實例不會(除非您安裝一個或使實例成為輔助UI線程)。
類似地,UI組件綁定到特定線程。 它們需要一個執行消息抽取的STA線程(例如, Application.DoEvents
)。
在我看來,你正在創建一個手動Thread
,然后從該線程創建UI組件(所以你知道該線程應該是STA 並包含一個消息循環,這些都不在你的代碼中)。 然后該線程啟動一個消息泵送的BGW。
目前還不清楚你要在這里完成什么 - 也許在一個單獨的線程中顯示一個對話框?
WinForms應用程序中的多個UI線程不是官方支持的場景AFAIK,盡管有些人已經開始工作。 不過,我從未見過需要它。
根據您所顯示的內容(這是不完整的,所以這可能不是問題),您不是將事件連接到backgroundWorker_DoWork
和backgroundWorker_RunWorkerCompleted
事件處理程序。 某處(在實例化你的backgroundWorker
),你應該這樣:
backgroundWorker.DoWork += new EventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new EventHandler(backgroundWorker_RunWorkerCompleted);
作為免責聲明,這是手寫的,因此事件名稱或EventHandler類型可能不正確。
我真的不知道如何明確地修改你的代碼,或者如果你的代碼甚至以你的方式工作,我只能給你以下的指導。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.