方法 : チャネル ファクトリを使用して、非同期的に操作を呼び出す
ここでは、ChannelFactory ベースのクライアント アプリケーションを使用する場合に、クライアントからサービス操作に非同期にアクセスする方法について説明します。サービスを呼び出すために System.ServiceModel.ClientBase オブジェクトを使用する場合は、イベント ドリブンの非同期呼び出しモデルを使用できます。詳細については、「方法 : WCF サービス操作を非同期に呼び出す」を参照してください。イベント ベースの非同期呼び出しモデルの詳細については、「Multithreaded Programming with the Event-based Asynchronous Pattern」を参照してください。
このトピックのサービスは、ICalculator
インターフェイスを実装しています。クライアントはこのインターフェイスにある操作を非同期に呼び出すことができます。これはたとえば Add
という操作を BeginAdd
と EndAdd
の 2 つのメソッドに分割できることを意味します。前者によって呼び出しを開始し、後者によって操作の完了時に結果を取得します。サービス操作を非同期的に実装する方法を示す例については、「方法 : 非同期サービス操作を実装する」を参照してください。同期操作と非同期操作の詳細については、「同期操作と非同期操作」を参照してください。
手順
WCF サービス操作を非同期に呼び出すには
次のコマンドに示すように、/async オプションを指定して ServiceModel Metadata Utility Tool (Svcutil.exe) ツールを実行します。
svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8000/servicemodelsamples/service/mex /a
これにより、操作の非同期クライアント版のサービス コントラクトが生成されます。
次のサンプル コードに示すように、非同期操作の完了時に呼び出されるコールバック関数を作成します。
サービス操作に非同期にアクセスするには、次のサンプル コードに示すように、クライアントを作成して
Begin[Operation]
(たとえばBeginAdd
) を呼び出し、コールバック関数を指定します。コールバック関数が実行されると、クライアントは
End<operation>
(EndAdd
など) を呼び出して結果を取得します。
例
上記の手順で使用したクライアント コードで使用するサービスは、次のコードに示すように ICalculator
インターフェイスを実装しています。コントラクトの Add
操作と Subtract
操作は、上記のクライアントの手順がクライアントで非同期に呼び出される場合でも、サービス側では Windows Communication Foundation (WCF) のランタイムにより同期して呼び出されます。Multiply
操作と Divide
操作は、クライアントで同期して呼び出される場合でも、サービス側ではサービスを非同期に呼び出すように使用されます。この例では、AsyncPattern プロパティを true に設定します。このプロパティ設定は .NET Framework 非同期パターンの実装と共に、ランタイムに対して、操作を非同期で呼び出すよう指示します。