Подтвердить что ты не робот

Последовательное ожидание VS Продолжение ожидания

Мне было интересно, какой лучший/правильный способ написания асинхронного кода, состоящего из двух (или более) асинхронных и зависимых (первые должны выполнить для выполнения вторых) операций.

Пример с async/wait:

await RunFirstOperationAsync();
await RunSecondOperationAsync();

Пример с продолжением:

await RunFirstOperationAsync()
    .ContinueWith(t => RunSecondOperationAsync());
4b9b3361

Ответ 1

Если вы, возможно, захотите использовать await.

ContinueWith имеет ряд проблем. Я кратко описываю это в своем сообщении в блоге почему ContinueWith является опасным, который основывается на моем предыдущем сообщении в блоге на почему StartNew является опасным (они разделяют многие из тех же проблем).

В частности:

  • ContinueWith не имеет хорошего значения по умолчанию TaskScheduler. Планировщик заданий по умолчанию - TaskScheduler.Current (не TaskScheduler.Default), и возобновление в текущем SynchronizationContext должно выполняться вручную, если это необходимо.
  • ContinueWith имеет неидеальный по умолчанию options. Для асинхронного кода вам потребуется DenyChildAttach и ExecuteSynchronously, по крайней мере.
  • ContinueWith не понимает асинхронных продолжений, которые обычно требуют дополнительного вызова Unwrap, чтобы обойти это ограничение.
  • ContinueWith рассматривает свой аргумент CancellationToken удивительным образом. Подробнее об этом в этом сообщении в блоге.

Все эти аргументы обобщены на моем блоге в разделе "Продолжение задачи" . await не имеет каких-либо из этих недостатков.