可以在UI线程上运行的BeginInvoke中断代码吗?

时间:2010-01-12 11:25:21

标签: c# .net winforms multithreading

假设我有一些在UI线程中运行的代码,它产生一个新线程在后台工作,然后继续做UI工作。完成后台工作后,将从新线程调用BeginInvoke。如果UI工作仍在进行,给BeginInvoke的回调是否会中断UI工作,还是会等待?

代码示例 - 向表单添加一个名为button1的按钮,并将button1_Click添加到其click事件中,然后将其添加到表单中:

bool continueWork = true;

private void button1_Click(object sender, EventArgs e)
{
    Thread workThread = new Thread(performBackgroundWork);

    workThread.IsBackground = true;
    workThread.SetApartmentState(ApartmentState.STA);
    workThread.Start();

    for (long i = 0; i < long.MaxValue; i++)
    {
        if (!continueWork)
            break;

        button1.Text = i.ToString();
    }
}

private void performBackgroundWork()
{
    Thread.Sleep(1);
    button1.BeginInvoke(new MethodInvoker(stopUIWork));            
}

private void stopUIWork()
{
    continueWork = false;
}

点击后按钮1的文字是什么?

1 个答案:

答案 0 :(得分:5)

BeginInvoke将委托添加到队列中(确切地说是消息队列)。所以答案是否定的,他们不会被打断。实际上,由于消息队列中的消息,您的按钮单击处理程序也已执行。

编辑:对不起,我忘了回答你的第二个问题了,但你可以自己解决这个问题。按钮文本将为long.MaxValue - 1.您可能希望在不使用BeginInvoke的情况下执行stopUIWork