非阻塞异步方法在哪个线程上运行

时间:2018-08-01 05:07:57

标签: asynchronous async-await nonblocking c#-5.0

我们说,如果等待的表达式不完整,则使用异步方法 暂停并返回到呼叫者。

等待的表达式完成后,它将恢复执行。

它恢复在哪个上下文上由ConfigureAwait决定。

但是在等待的表达式完成后,暂停,返回调用者和恢复之间会发生什么。

等待表达式在什么地方执行,而?

在线程池线程或UI线程上。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    // will resume on UI's context.
    button.Content = await GetString().ConfigureAwait(true);
}

private async Task<string> GetString()
{
    // where does this section of code runs ?
    return await Task.Delay(3000).ContinueWith(x => "Async Content");
}

1 个答案:

答案 0 :(得分:0)

线程池和UI线程都没有。它根本不执行。调用Task.Delay时,Delay方法将创建一个Timer,并且GetString和Button_Click都将返回。 3000毫秒后,Timer回调将在某个线程池线程上执行。它可以完成任务并安排任务继续执行,GetString和Button_Click中的其余代码在相应的线程上执行。