2017-01-05 5 views
0

Ich versuche, das gRPC C# -Beispiel in WPF arbeiten.
Derselbe Code, der in einer Konsolenanwendung funktioniert, funktioniert nicht.
Was vermisse ich. Die minimal-Klasse, die in der Konsole App funktioniert und nicht in WPF funktioniert wie folgt aussieht:gRPC mit WPF funktioniert nicht

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; 
      } 
     } 
    } 

Die responseStream.MoveNext() ist, wo es hängt. Es reagiert nicht auf gesendete Objekte und löst auch keine Ausnahme aus, wenn der gRPC-Server nicht vorhanden ist. Was habe ich verpasst?

Antwort

2

Das Problem ist der blockierende Aufruf ProcessFeed().Wait(); innerhalb des Konstruktors.

Dieser Beitrag erklärt, warum: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Um das Problem zu lösen, rufen await ProcessFeed(); von außen (nicht im costructor).

+0

Leider ist es meine Anforderung, es während des Startvorgangs aufzurufen, da ich einen Feed hören möchte. – weismat

+0

Ok - Ich beginne jetzt eine zusätzliche Aufgabe für die Verarbeitung warten. – weismat