Рассмотрим фрагмент кода, например:
public async Task<Bitmap> DownloadDataAndRenderImageAsync(
CancellationToken cancellationToken)
{
var imageData = await DownloadImageDataAsync(cancellationToken);
return await RenderAsync(imageData, cancellationToken);
}
Первый из шагов этого метода - работа с привязкой ввода/вывода, где вторая, вычислительная.
Когда мы полагаемся на компилятор для создания правильного целевого кода для этой асинхронной операции, что делает компилятор?
В частности, знает ли он, что первый из них связан с I/O, поэтому он должен использовать класс TaskCompletionSource<T>
, чтобы между потоком и задачей не было сродства, а для второго оно может использовать любые методов, таких как Run
или StartNew
или Start
, чтобы запланировать задачу в потоке пула потоков?