2017-01-05 5 views
0

Я пытаюсь получить пример gRPC C#, работающий внутри WPF.
Тот же код, который работает внутри консольного приложения, не работает.
Что мне не хватает. Минимальный класс, который работает в консоли App и не работает в WPF выглядит следующим образом:gRPC с 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 не существует. Что я пропустил?

ответ

2

Проблема заключается в блокирующем вызове ProcessFeed().Wait(); внутри конструктора.

Это сообщение объясняет, почему: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Чтобы решить эту проблему, звоните await ProcessFeed(); извне (не в costructor).

+0

К сожалению, мое требование - называть его во время запуска, поскольку я хочу слушать фид. – weismat

+0

Хорошо. Теперь я начинаю выполнять дополнительную задачу для обработки. – weismat