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

Asynchronous 非阻塞异步方法在哪个线程上运行,asynchronous,async-await,nonblocking,c#-5.0,Asynchronous,Async Await,Nonblocking,C# 5.0,我们说,如果等待的表达式不完整,那么异步方法 暂停并返回给调用者 等待的表达式完成后,将继续执行 它在哪个上下文上恢复由ConfigureWait指定 但是,在暂停和返回调用方以及在等待的表达式完成后恢复之间会发生什么呢 等待的表达式在哪里执行意味着while 在线程池线程或UI的线程上 private async void Button_Click(object sender, RoutedEventArgs e) { // will resume on UI's context.

我们说,如果等待的表达式不完整,那么异步方法 暂停并返回给调用者

等待的表达式完成后,将继续执行

它在哪个上下文上恢复由ConfigureWait指定

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

等待的表达式在哪里执行意味着while

在线程池线程或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");
}
private async void按钮\u单击(对象发送方,路由目标)
{
//将在UI的上下文上恢复。
button.Content=await GetString().ConfigureAwait(true);
}
私有异步任务GetString()
{
//这段代码在哪里运行?
return wait Task.Delay(3000).ContinueWith(x=>“异步内容”);
}

既不是线程池也不是UI线程。它根本不执行。当调用Task.Delay时,Delay方法创建一个计时器,GetString和Button_都单击return。
3000毫秒后,计时器回调将在某个线程池线程上执行。它完成任务并安排任务继续,GetString和Button_Click中的其余代码在各自的线程上执行。

GetString
在线程池线程上安排,并返回
TaskWaiter
以保留引用。如果
TaskAwaiter
在代码跳出当前状态之前完成,则返回结果,代码进入下一个等待。如果未完成,则
TaskAwaiter
正在等待该任务,并为该任务配置了wait上的continuation。