asynchronous - 非阻塞异步方法在哪个线程上运行
问题描述
我们说,如果等待的表达式不完整,那么异步方法会暂停并返回给调用者。
一旦等待的表达式完成,它就会恢复执行。
它在哪个上下文中恢复由 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");
}
解决方案
既不是线程池,也不是 UI 线程。它根本不执行。调用 Task.Delay 时,Delay 方法会创建一个 Timer,GetString 和 Button_Click 都会返回。3000 毫秒后,Timer 回调在某个线程池线程上执行。它完成任务并安排任务继续,GetString 和 Button_Click 中的其余代码在各自的线程上执行。
推荐阅读
- python - 如何在不使用 (G * priv) 的情况下手动将 Publick_key 粘贴到代码中?
- css - Div 在另一个有子 Div 的 Div 上溢出
- reactjs - 未找到 Netlify 页面/白页
- python - 混合详细视图和表单 Mixin django 的问题
- typescript - 为什么可以在没有指定泛型类型参数的情况下实例化泛型类
- mysql - 分隔符上的 MySQL 字符串拆分
- express - 超测和开玩笑:无法关闭快速连接
- python - 脚本不产生输出
- flutter - Flutter:向 LIst 添加值会触发 RangeError(索引)
- flutter - Flutter build runner - pub 以退出代码 65 结束