Инкапсулировать асинхронный метод в Func

#c# #asynchronous #async-await #grpc

#c# #асинхронный #асинхронный-ожидание #grpc

Вопрос:

Во-первых, я надеюсь, что название в порядке.

У меня есть клиент Grpc с хорошо известной службой greeter, и я пытаюсь инкапсулировать вызов SayHelloAsync в функцию. Но оператор => перенаправляется, потому что он не может преобразовать выражение, которое он говорит. Это сработает, если я удалю любую асинхронность / ожидание. Вероятно, это потому, что SayHelloAsync возвращает AsyncUnaryCall(у которого есть ожидающий) вместо задачи, но в конце концов это не проблема Grpc, я думаю, это просто мое непонимание.

Вот моя попытка:

 static async Task Main()
{
   var client = CreateGreeterClient();
   await UnsafeTask<Service.HelloReply>(async ()  =>
   {
       var result = await client.SayHelloAsync(new Service.HelloRequest { Name = greeter.Name });
       return Task<Service.HelloReply>.FromResult(result);
   });
   Console.ReadKey();
}

static async Task<T> UnsafeTask<T>(Func<AsyncUnaryCall<T>> method) where T:class
{
   try
   {
      return await method();
   }
   catch (Exception exception)
   {
      Console.WriteLine(exception.Message);
      return null;
   }           
} 
  

Любой совет был бы полезен.

Комментарии:

1. Почему именно вы используете return Task<Service.HelloReply>.FromResult(result); ? Конечно, это должно быть просто return resu< ?

2. Вы оборачиваете задачу слишком много раз? Попробуйте просто return resu<

3. Примечание: если механизм AsyncUnaryCall etc вам не нравится, то вам может показаться интересным protobuf-net.Grpc; он основан на тех же API gRPC, но имеет более идиоматичный. ЧИСТАЯ форма API

4. Хороший плагин @MarcGravell 🙂 Я надеюсь начать использовать его в ближайшее время, когда мы начнем переходить с JSON на gRPC в моей компании

5. @aepot ты сделал мой день 😉 спасибо!