2010-05-16 54 views
3

哪個線程的BeginInvoke的異步委託回調應該在?
UI線程或線程池線程。哪個線程的一個BeginInvoke的異步委託的回調函數在?

例如

private void button1_Click(object sender, EventArgs e) 
{ 
    Func<string> func1 = LoadingDada; 
    func1.BeginInvoke(IsDone, func1); 
} 


string LoadingDada() 
{ 
    Thread.Sleep(10000); //simulated a long running 
    x = Thread.CurrentThread.Name; 
    return "str_100000"; 
} 

string IsDone(IAsyncResult a) 
{ 
    var loadingDataReturn = (Func<string>)a.AsyncState; 
    string rr = loadingDataReturn.EndInvoke(a); 

    textBox1.Text = rr; 
} 
+0

如何把代碼放在一個塊中?功能無法顯示。 – northTiger 2010-05-16 21:19:13

+0

代碼縮進4個空格(或更多)。嘗試選擇您的代碼並單擊代碼按鈕(0和1)。 – MusiGenesis 2010-05-16 21:21:25

回答

4

要調用BeginInvoke在委託,所以這將是一個池線程。如果你在一個控件上調用了BeginInvoke,它將是UI線程。

不幸的是,BeginInvoke在這兩種情況下意味着幾乎完全相反。

+0

@Mark,我可以在IsDone()中更新UI控件。所以它在UI線程中? – northTiger 2010-05-16 21:28:59

+1

希望有人仍在聽...恐怕我覺得答案有點混亂。 我會以不同的方式說出問題:是否在原始BeginInvoke調用所在的同一線程上調用回調,還是由BeginInvoke使用的線程調用以執行指定的任何內容? – 2013-06-23 02:32:19

+0

@Mike在代理上使用BeginInvoke時,回調將始終發生在不同的線程(工作者/池線程)上。 – 2013-06-23 08:34:22