2010-05-16 29 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