2017-01-06 26 views
4

MVCをパターンとしてWCFバックエンドとともに使用するWPFアプリケーションを構築しています。 私のUIは常に応答しなければならず、一部のコントロールではデータの読み込みに最大10秒かかることがあります。WPF with MVC with WCF with async await pattern

ConfigurationsForInterface = new ObservableCollection<string>() { "Loading..." };  
ConfigurationsForInterface = await GetConfigurationInterfaceXAsync(); 

方法正常に動作します:

コードがうまく機能してConfigurationsForInterfaceは、私のコントロールにバインドされた観察可能なタイプである私のviewmodelの内側にある後

 public async Task<ObservableCollection<string>> GetConfigurationHL7Server5Async() 
     { 
      ObservableCollection<string> result; 

      using (var localClient = new ManagerListenerClient(Globals.ChannelBinding, Globals.EndpointAddress)) 
      {    
       result = await localClient.GetConfigurationsAsync("interfacex"); 
      } 

      return result; 
     } 

メソッドは、その私はサービス(ユーザ)のコンテキストを設定しているので、アプリケーションの他の領域ですでに開いているサービスクライアントを再利用するので、私のUIはフリーズする

public async Task<ObservableCollection<string>> GetConfigurationHL7Server5Async() 
    { 
     ObservableCollection<string> result; 

     result = await Globals.Client.GetConfigurationsAsync("interfacex"); 

     return result; 
    } 

WCFクライアントは私のUIスレッドに何らかの形で結合していると、データがロードされるまで凍結するために私のUIを起こすように思えます。デバッグから、メソッド自体で待機していないことがわかります。私はちょうど同期私は本当の問題を正確に指摘@Rowbearへ

+1

この方法の使い方を教えてください。 – Fabio

+1

ちょうどいいヒント:グローバルコンテキストでWCFクライアントを使用しないでください。ちょうど、正しく接続されていない接続からのメモリリークを求めています。 –

+1

ohまた、WCFクライアントはスレッドセーフではないので、同じクライアントで同時に複数の呼び出しを行うと、おそらくループが発生します。 –

答えて

0

感謝のviewmodelを呼び出すような非同期コンテキストで常に他の場所ではなく使用されている私のWCFクライアントオブジェクトを再利用傾ける理由

誰かが私を助けることができます。

私のバインディングをWsHttpBindingからNetTCPBindingに変更したところ、すべてがうまく非同期で実行されました。私のアプリではNetTCPBindingを簡単に使うことができます。

まだ何かが同期しているようです。 WsHttpBindingの実装では

ありがとうございます!アドバイスのために。