首页 > 解决方案 > 非阻塞异步方法在哪个线程上运行

问题描述

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

一旦等待的表达式完成,它就会恢复执行。

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

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

等待的表达式在哪里执行意味着 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");
}

标签: asynchronousasync-awaitnonblockingc#-5.0

解决方案


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


推荐阅读