2010-01-12 109 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

相關問題