我可以向已经在运行的后台工作线程添加回调吗?

本文关键字:线程 工作 添加 回调 后台 可以向 运行 我可以 | 更新日期: 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();
}