Почему AsyncUnaryCall <T>и другие не расширяют задачу <T>? - PullRequest
0 голосов
/ 14 февраля 2019

При работе с gRPC в C # асинхронные вызовы возвращают AsyncUnaryCall<T> (для унарных вызовов - конечно, другие вызовы имеют немного другие типы возврата).Однако AsyncUnaryCall<T> не распространяется Task<T>.Поэтому обычные вещи, которые вы обычно делаете с Task<T>, не работают с AsyncUnaryCall<T>.Это включает:

  • указание политики продолжения (с использованием ConfigureAwait)
  • с использованием таких помощников, как Task.WhenAny и Task.WhenAll

Последнеесейчас меня кусают, так как я хочу запустить несколько вызовов gRPC и дождаться их завершения.Кажется, я могу написать маленького помощника, который ждет одного за другим.

Почему AsyncUnaryCall<T> не отражает функциональность Task<T>?

1 Ответ

0 голосов
/ 14 февраля 2019

Как я уже сказал в комментарии, хотя он «похож на задачу», на самом деле представляет два отдельных Task s .Если вы хотите работать с отдельными Task s как Task s, просто получите доступ к соответствующему свойству (например, ResponseHeadersAsync или ResponseAsync).

Если у вас естьпеременная themAll типа List<AsyncUnaryCall<T>>, тогда использовать WhenAll / WhenAny просто:

await Task.WhenAny(themAll.Select(c=>c.ResponseHeadersAsync));

если у вас есть полезная работа, которую вы можете выполнять при появлении любых заголовков, или

await Task.WhenAll(themAll.Select(c=>c.ResponseAsync));

, если вы не можете сделать ничего полезного, пока все они не будут завершены.Как два примера.Точно так же вы можете извлечь одну из этих задач и использовать ее в await с ConfigureAwait, если вы хотите это сделать.

...