我可以向已经在运行的后台工作线程添加回调吗?
本文关键字:线程 工作 添加 回调 后台 可以向 运行 我可以 | 更新日期: 2023-09-27 17:56:03
是否可以在后台工作线程运行时向其添加回调?
bw.DoWork += new DoWorkEventHandler( some callback );
bw.RunWorkerAsync();
bw.DoWork += new DoWorkEventHandler( some callback );
谢谢。
是的,你可以,因为它只是一个事件的订阅,但在他完成第一个任务的执行之前你不能运行 bw
下面是一个示例来说明这一点,以下代码将显示一个InvalidOperationException
告诉 This 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
一起使用并将其附加到您的 UItaskScheduler 它将具有与您使用 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();
}