Generi c ожидаемый - как запланировать продолжение? - PullRequest
0 голосов
/ 24 апреля 2020

У меня под рукой есть объект, который может быть Task, ValueTask или ValueTask<T> (оптимально я могу поддерживать любой тип ожидаемого). Независимо от фактического типа, я хочу запланировать продолжение. Оптимально продолжение может определить, было ли успешно завершено исходное ожидание, отказано или было отменено.

Как это сделать?

Моя первая попытка была:

var getAwaiterMethod = invocation.ReturnValue.GetType().GetMethod(nameof(Task.GetAwaiter));
var awaiter = (INotifyCompletion) getAwaiterMethod.Invoke(myAwaitableObject, new object[0]);
awaiter.OnCompleted(() => myContinuation);

Тем не менее, в этом случае продолжение не может сказать, успешно ли завершилось ожидаемое, отменено или отменено.

Есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Не уверен, что это видео поможет вам, но оно дало мне огромный толчок в понимании того, что вы можете делать с Задачами. В частности, он охватывает операции ContinueWith с опциями продолжения задачи, которые дадут вам то, что вам нужно. Начните примерно с 48:00 и верните go назад и перезапустите, если необходимо.

Огромные реквизиты Джереми Кларку за то, что он опубликовал это видео, и я часто появляюсь в этом видео, чтобы вытащить себя из сорняков.

Если вы предпочитаете копаться в документах, посмотрите здесь документы MS о цепочках задач с использованием параметров продолжения.

0 голосов
/ 24 апреля 2020

Вы можете await a dynamic тип:

dynamic o = myAwaitableObject;
await o;

Я не уверен, насколько хорошо это будет работать с ValueTask<T>, хотя; Я еще не пробовал.

...