簡體   English   中英

c#從另一個線程調用backgroundWorker而不是UI線程

[英]c# calling backgroundWorker from another thread than UI thread

我正在嘗試像下面的代碼一樣加載loadingForm 但它不起作用,loadForm不會消失, RunWorkerCompleted事件不會被調用。

而且,我需要多次調用loadingFormbackgroundWorker ,那么如何在每次調用后完全處理loadingFormbackgroundWorker

我認為我的代碼中有很多問題,但我不知道如何修復它。 你能告訴我如何解決我的問題並指出我需要修復的地方嗎? 非常感謝提前。

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_DoWorkbackgroundWorker_RunWorkerCompleted事件處理程序。 某處(在實例化你的backgroundWorker ),你應該這樣:

backgroundWorker.DoWork += new EventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new EventHandler(backgroundWorker_RunWorkerCompleted);

作為免責聲明,這是手寫的,因此事件名稱或EventHandler類型可能不正確。

我真的不知道如何明確地修改你的代碼,或者如果你的代碼甚至以你的方式工作,我只能給你以下的指導。

  1. 使用后台工作程序的CancellationPending屬性,而不是IsBusy屬性
  2. 使用Windows窗體和線程代碼時,請始終使用Invoke / BeginInvoke方法確保將調用 送回控件所源自的線程。

暫無
暫無

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

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