2011-10-04 15 views
5

ChanellFacotryを使用してプロキシを作成するSilverlightアプリケーショントラフでwcfサービスを使用しています。Silverlightで非同期に同期WCF操作コントラクトメソッドを呼び出す

Operation and Dataコントラクトは、serversideのData and Operation contract libriaryからの共有ファイルで構成されたSilverlight Troughアセンブリに公開されています。 (私はあなたが私が言っていることを理解することを望む)。

したがって、サーバーとクライアントは同じ操作とデータ契約を使用しています。

Silverlight wcf client libには、わかっているようにwcfメソッドを同期的に呼び出せないという制限があります。共有操作コントラクトファイルでは、各操作のasynバージョンが公開されている必要があります。

非同期WCFサービスを記述することは、ブロッキング操作が含まれていない場合には意味がありますが、EFを使用しているときは、ブロックプールをスレッドプールに委任することでasyncrhonyを実現します。これは、WCFがとにかく同期メソッドに対して行うことです。そして、この事実は私の目を裂きたい(#@%!^%!@%)。

私たちのプロジェクトコンサルタントは、同期操作契約メソッド(google Yevhen Bobrov Servelat Pieces)に動的なプロキシを生成させる権限を持ちません。だから、パフォーマンスを向上させることなく、サーバサイドで非同期メソッドの実装を書く必要があります(覚えているように呼び出しをブロックする)。

データコントラクトを使用して、Silverlightからwcf Webサービス同期メソッドを呼び出すことはできますか?

これまでにこの問題に直面したことがありますか?もしそうなら、どのように解決しましたか?

私は、サーバサイド契約を変換ソースとして使用するだけでクライアント側の非同期契約を生成することを楽しみにしています。たぶん私にとってうまくいくt4テンプレートがありますか?

、これは非同期契約の実装がmommentでどのように見えるかですちょうど私の質問にいくつかのコードを混合すると、テキストの壁のために申し訳ありません:

/// <summary> 
    /// Subscribes to users of the specified organization. 
    /// </summary> 
    /// <param name="organizationId">The organization id.</param> 
    public void Unsubscribe(int organizationId) 
    { 
     var clientId = this.OperationContext.GetClientId(); 
     if (string.IsNullOrEmpty(clientId)) 
     { 
      return; 
     } 

     this.InternalUnsubscribe(organizationId, clientId); 
    } 

    /// <summary> 
    /// Begins an asynchronous operation to Unsubscribe. 
    /// </summary> 
    /// <param name="organizationId">The organization id.</param> 
    /// <param name="callback">The callback.</param> 
    /// <param name="passThroughData">The pass through data.</param> 
    /// <returns> 
    /// An implementation of <see cref="IAsyncResult"/> that provides access to the state or result of the operation. 
    /// </returns> 
    public IAsyncResult BeginUnsubscribe(int organizationId, AsyncCallback callback, object passThroughData) 
    { 
     var clientId = this.OperationContext.GetClientId(); 
     if (string.IsNullOrEmpty(clientId)) 
     { 
      return null; 
     } 

     var asyncResult = new VoidAsyncResult(callback, passThroughData); 
     Task.Factory.StartNew(() => 
      { 
       try 
       { 
        this.InternalUnsubscribe(organizationId, clientId); 
        asyncResult.SetAsCompleted(false); 
       } 
       catch (Exception ex) 
       { 
        asyncResult.SetAsCompleted(ex, false); 
       } 
      }); 
     return asyncResult; 
    } 

    /// <summary> 
    /// Ends an existing asynchronous operation to Unsubscribe. 
    /// </summary> 
    /// <param name="result">The <see cref="IAsyncResult"/> provided by the BeginUnsubscribe operation.</param> 
    public void EndUnsubscribe(IAsyncResult result) 
    { 
     var response = result as VoidAsyncResult; 
     if (response != null) 
     { 
      response.EndInvoke(); 
     } 
    } 

答えて

3

あなたは非同期であることをWCFサービスを記述する必要はありません。 Asyncメソッドを定義するサービスのServiceContractを簡単に作成する必要があります。ここに簡単な例があります

ここで、あなたのChannelFactoryでIMyServiceAsyncを使用すると、すべてがうまくいきます。

+0

ありがとう、私は今、この変換を行うことができるt4テンプレートを見つけました。 – v00d00

+0

どのように動作するか教えてください。私はこれをするためにt4を探すことを意味してきたが、時間がなかった。 – cadrell0

+0

それは失敗し、明示的に操作名を指定しようとします – v00d00

関連する問題