Sim*_*mon 0 .net c# multithreading winforms
假设我有一些在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;
}
Run Code Online (Sandbox Code Playgroud)
点击后button1的文字是什么?
BeginInvoke将委托添加到队列(确切地说是消息队列).所以答案是否定的,他们不会被打断.您的按钮单击处理程序实际上也是由于消息队列中的消息而执行的.
编辑:对不起,我忘了回答你的第二个问题,但你可以自己解决这个问题.按钮文本将为long.MaxValue - 1.您可能希望在stopUIWork不使用BeginInvoke的情况下执行.