【问题标题】:On which thread does a non blocking async method runs非阻塞异步方法在哪个线程上运行
【发布时间】:2019-01-08 13:50:42
【问题描述】:

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

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

它在哪个上下文中恢复由 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");
}

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多