2010-01-12 111 views
0

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

代码示例 - 添加一个名为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; 
} 

被点击后是什么Button1的文本?

回答

5

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

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

相关问题