2014-04-02 68 views
0

是否可以在運行時向後臺工作人員添加回調?我可以添加回調到已經運行的BackgroundWorker嗎?

bw.DoWork += new DoWorkEventHandler(some callback); 

bw.RunWorkerAsync(); 

bw.DoWork += new DoWorkEventHandler(some callback); 

謝謝。

+1

是的,你能夠。但那不會被稱爲我想 –

+0

@SriramSakthivel謝謝。有沒有辦法將任務放入隊列中? – Virus721

+2

您可以使用'Queue'類來實現此目的,將工作項添加到它,然後逐個處理。另一個選擇是使用'BlockingCollection' –

回答

1

當然可以,因爲它是唯一一個訂閱的事件,但你不能運行BW,直到他已經完成了第一個任務

這裏一個例子的執行來說明這個下面的代碼將顯示一個InvalidOperationException說服力這BackgroundWorker is currently busy and cannot run multiple tasks concurrently."

public partial class Form1 : Form 
    {      
     public Form1() 
     { 
      InitializeComponent(); 
      backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
      backgroundWorker1.RunWorkerAsync(); 
      backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker2_DoWork); 
      //at this line you get an InvalidOperationException 
      backgroundWorker1.RunWorkerAsync(); 




     } 

     void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      do 
      { 

      } while (true); 
     } 
     void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) 
     { 
      do 
      { 

      } while (true); 
     } 
     } 

作爲回答您的評論的問題

@SriramSakthivel Thanks. Is there a way to put tasks in a queue ?

是的,你可以的,如果你使用的是.NET 4.0中,您可以使用任務與ContinueWith並將其連接到您的UI 的TaskScheduler將有相同的行爲,如果你正在使用的BackgroundWorker

private void TestButton_Click(object sender, EventArgs e) 
{ 
    TestButton.Enabled = false; 
    var uiThreadScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

    var backgroundTask = new Task(() => 
    { 
     Thread.Sleep(5000); 
    }); 

    var uiTask = backgroundTask.ContinueWith(t => 
    { 
     TestButton.Enabled = true; 
    }, uiThreadScheduler); 

    backgroundTask.Start(); 
} 
相關問題