带有 WPF 的 gRPC 不工作
gRPC with WPF not working
我正在尝试让 gRPC C# 示例在 WPF 中运行。
在控制台应用程序中运行的相同代码不起作用。
我错过了什么。
在控制台应用程序中有效但在 WPF 中无效的最小 class 如下所示:
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 服务器不存在,它也不会触发异常。我错过了什么?
问题是构造函数中的阻塞调用 ProcessFeed().Wait();
。
这 post 解释了原因:
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
要解决此问题,请从外部(而不是在构造函数中)调用 await ProcessFeed();
。
我正在尝试让 gRPC C# 示例在 WPF 中运行。
在控制台应用程序中运行的相同代码不起作用。
我错过了什么。
在控制台应用程序中有效但在 WPF 中无效的最小 class 如下所示:
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 服务器不存在,它也不会触发异常。我错过了什么?
问题是构造函数中的阻塞调用 ProcessFeed().Wait();
。
这 post 解释了原因: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
要解决此问题,请从外部(而不是在构造函数中)调用 await ProcessFeed();
。