一个异步委托的BeginInvoke回调在哪个线程中?

3

BeginInvoke的异步委托回调应该在哪个线程中?
是UI线程还是线程池线程。

例如:

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;
} 

如何将代码放入块中?Func<string>无法显示。 - northTiger
代码缩进4个空格或更多。尝试选择您的代码并单击CODE按钮(0和1)。 - MusiGenesis
1个回答

4
你正在调用委托的BeginInvoke方法,因此它将成为线程池线程。如果你在控件上调用BeginInvoke方法,那么它将成为UI线程。
不幸的是,在这两种情况下,BeginInvoke的含义几乎完全相反。

@Mark,我可以在IsDone()中更新UI控件,这样它就在UI线程中了吗? - northTiger
1
希望还有人在听...我担心我会对答案感到有些困惑。我会用不同的措辞来提问:回调函数是在与原始的BeginInvoke调用相同的线程上调用,还是从BeginInvoke使用的线程中调用执行指定任务的线程上被调用? - Mike Fulton
@Mike 当在委托上使用BeginInvoke时,回调将始终发生在不同的线程上 - 工作/池线程。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接