c# - C# 编译器能否区分 I/O 绑定(bind)任务和计算任务?

标签 c# .net asynchronous async-await

考虑这样一段代码:

public async Task<Bitmap> DownloadDataAndRenderImageAsync(
    CancellationToken cancellationToken)
{
    var imageData = await DownloadImageDataAsync(cancellationToken);
    return await RenderAsync(imageData, cancellationToken);
}

此方法的第一步是 I/O 绑定(bind)工作,第二步是计算。

当我们依赖编译器为这个异步操作生成正确的基于任务的代码时,编译器做了什么?

具体来说,它是否知道第一个是 I/O 绑定(bind)的,所以它必须使用 TaskCompletionSource<T>类,以便线程和任务之间没有亲和性,对于第二个线程,它可以使用任何方法,例如 RunStartNewStart在线程池线程上安排任务?

最佳答案

没有。在您给出的示例中,编译器将仅使用 TaskCompletionSource<T> (间接)用于整体异步操作 ( DownloadDataAndRenderImageAsync )。由调用的两个方法决定它们将如何返回相关任务。

也许 DownloadImageDataAsync本身就是一个 async委托(delegate)给更多异步 I/O 的方法。也许RenderAsync电话 Task.Run .这些都是编译器在编译时根本不关心的实现细节 DownloadDataAndRenderImageAsync .

关于c# - C# 编译器能否区分 I/O 绑定(bind)任务和计算任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846095/

相关文章:

c# - 如何调试 XML 反序列化?

c# - 类型推断推断的是类的范围,而不是方法,尽管它们是相同的?

.net - 使用 git 子模块时应该将 3rd 方 .NET dll 放在哪里以避免重复

c# - 多行字符串变量

c# - HttpRuntime.Cache 的范围

java - SwingWorker process() GUI 更新困难与合并 block

c# - WPF 中的 HitTest

c# - 如何在 Windows RT 中发送击键

html - React - 转换 HTML 脚本标签以异步加载 SDK

javascript - Node.js forEach 放入数组