考虑这样一段代码:
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>
类,以便线程和任务之间没有亲和性,对于第二个线程,它可以使用任何方法,例如 Run
或 StartNew
或 Start
在线程池线程上安排任务?
最佳答案
没有。在您给出的示例中,编译器将仅使用 TaskCompletionSource<T>
(间接)用于整体异步操作 ( DownloadDataAndRenderImageAsync
)。由调用的两个方法决定它们将如何返回相关任务。
也许 DownloadImageDataAsync
本身就是一个 async
委托(delegate)给更多异步 I/O 的方法。也许RenderAsync
电话 Task.Run
.这些都是编译器在编译时根本不关心的实现细节 DownloadDataAndRenderImageAsync
.
关于c# - C# 编译器能否区分 I/O 绑定(bind)任务和计算任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846095/