#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, но имеет более идиоматичный. ЧИСТАЯ форма API4. Хороший плагин @MarcGravell 🙂 Я надеюсь начать использовать его в ближайшее время, когда мы начнем переходить с JSON на gRPC в моей компании
5. @aepot ты сделал мой день 😉 спасибо!