0
是否可以在運行時向後臺工作人員添加回調?我可以添加回調到已經運行的BackgroundWorker嗎?
bw.DoWork += new DoWorkEventHandler(some callback);
bw.RunWorkerAsync();
bw.DoWork += new DoWorkEventHandler(some callback);
謝謝。
是否可以在運行時向後臺工作人員添加回調?我可以添加回調到已經運行的BackgroundWorker嗎?
bw.DoWork += new DoWorkEventHandler(some callback);
bw.RunWorkerAsync();
bw.DoWork += new DoWorkEventHandler(some callback);
謝謝。
當然可以,因爲它是唯一一個訂閱的事件,但你不能運行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();
}
是的,你能夠。但那不會被稱爲我想 –
@SriramSakthivel謝謝。有沒有辦法將任務放入隊列中? – Virus721
您可以使用'Queue'類來實現此目的,將工作項添加到它,然後逐個處理。另一個選擇是使用'BlockingCollection' –