2011-10-04 13 views
2

は、wcfサービス、syncおよびasyncで定義された2つのオペレーションコントラクトがあると仮定します。私は、WCFサービスも内部のスレッドプールを持っているので、各I/O操作が別のスレッドに終了することができる理解したようWCF。サービスの非同期メソッドと同期メソッドのパフォーマンスの違いは何ですか?

public void SubscribeSingle(int userId) 
{ 
    var clientId = this.OperationContext.GetClientId(); 
    var session = this.OperationContext.GetPollingDuplexSession(); 

    if (string.IsNullOrEmpty(clientId) || session == null || userId == 0) 
    { 
     return; 
    } 

    this.InternalSubscribeSingle(userId, clientId, session.SessionId); 
} 

public IAsyncResult BeginUnsubscribeSingle(int userId, AsyncCallback callback, object state) 
{ 
    var clientId = this.OperationContext.GetClientId(); 
    var session = this.OperationContext.GetPollingDuplexSession(); 

    if (string.IsNullOrEmpty(clientId) || session == null) 
    { 
     return null; 
    } 

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


public void EndUnsubscribeSingle(IAsyncResult result) 
{ 
    var response = result as VoidAsyncResult; 
    if (response != null) 
    { 
     response.EndInvoke(); 
    } 
} 

:2個のサンプルがあります。 Task.Factory.StartNewを使用して新しいスレッドを開始するだけです。

データベースのアクセスがEntityFrameworkによって行われ、ブロックされていても、パフォーマンスの観点からは、同期と非同期のサーバー呼び出しに違いはありますか?

+1

FYI Stephen Toubには、今月のMSDNマガジンのTask-based Asynchrony Patternを使用した非同期のパフォーマンスの影響に関する記事があります。ここで読むことができます:http://msdn.microsoft.com/en-us/magazine/hh456402.aspx –

答えて

1

ここでは、ある時点でスレッドをブロックするsyncメソッドを呼び出しているので、ここには非同期メソッドは価値がありません。非同期は、ディスク/ネットワークIOのようなノンブロッキング操作に至るまで何かを得るだけです。シンプルな同期バージョンを書いて、WCFにそのことをさせてください。

2

この2つのバージョンは同じです。しかし、一般的に非同期バージョンは非同期に同期バージョンを呼び出すよりもはるかに効率的です。例えば

、我々はFileStreamまたはTcpListernerを使用している場合、BeginReadとBeginAcceptSocketの非同期バージョンを呼び出すよりも、はるかに効率読むとAcceptSocketなどの適切な同期のバージョンを呼び出すよりもwhould。これは非同期関数がオペレーティングシステムによって提供される非同期APIを使用するためです。

たとえば、TcpListenerは別のtcpクライアントとやりとりするためにIO完了ポートを使用することができます。この方法では、遅延なしで非同期的に10Kのクライアントと簡単に対話できます。 FileSteamは、同期バージョンよりも少ないリソースを消費する、基本となる非同期操作にオーバーラップ構造を使用できます。

サービスの非同期メソッドでも非同期の基本APIを使用できる場合、非同期バージョンは、別のスレッドでsyncバージョンを呼び出すシンプルな非同期バージョンよりもはるかに効率的です。

関連する問題