我试图让gRPC C#示例在WPF中运行
在控制台应用程序中工作的相同代码不起作用。
我缺少什么。
在Console App中工作但在WPF中不起作用的最小类如下所示:
public class GrpcClientImpl
{
private GrpcService.GrpcService.GrpcServiceClient client;
public GrpcTestClientImpl()
{
var channel = new Channel("127.0.0.1:6980", ChannelCredentials.Insecure);
client = new GrpcService.GrpcService.GrpcServiceClient(channel);
ProcessFeed().Wait();
}
public async Task ProcessFeed()
{
try
{
using (var call = client.Feed(new FeedRequest()))
{
var responseStream = call.ResponseStream;
while (await responseStream.MoveNext())
{
var result = responseStream.Current;
Console.WriteLine("received result");
}
}
}
catch (RpcException e)
{
Console.WriteLine("RPC failed " + e);
throw;
}
}
}
responseStream.MoveNext()是挂起的地方。它不响应已发送的项目,如果gRPC服务器不存在,它也不会触发异常。我错过了什么?
答案 0 :(得分:2)
问题是构造函数中的阻塞调用ProcessFeed().Wait();
。
这篇文章解释了原因: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
要解决此问题,请从外部(不在costructor中)调用await ProcessFeed();
。