Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

リクエスト/レスポンスの非同期操作

目次

    • WCFサービス
    • WCFクライアント
      • 構成ファイルとプロキシクラスの作成
      • ソースコード
    • アプリ実行
    • 参考

WCFサービス

サービスはクライアントが同期/非同期のどちらであるかには関知しません。なので、サービスは以下のエントリーで作成したものを流用します。
IISでWCFサービスをホストする(サービスDLL編) - プログラマーな日々
そこで今回は実装をDLLに移行します。 ...

WCFクライアント

クライアントを非同期で実装します。

構成ファイルとプロキシクラスの作成


サービスへの参照を追加します。


SVCファイルへのアドレスを入力して「詳細設定」をクリックします


「非同期操作の生成」にチェックを入れて、OKボタンをクリックします。


SVCファイルへのアドレスを入力して「移動」をクリックします。


サービスが見つかりました。


プロキシクラスとapp.configが自動生成されました。

ソースコード

メソッドが非同期で呼び出されていることを確認します。

using System;
using System.Threading;
using HelloWorldClient.ServiceReference;

namespace HelloWorldClient {
    class Client {
        static void Main(string[] args) {
            StockServiceClient proxy = new StockServiceClient();
            {
                Console.WriteLine("1回目の呼び出し");
                IAsyncResult arGetPrice;
                arGetPrice = proxy.BeginGetPrice("msft", GetPriceCallback, proxy);
            }
            {
                Console.WriteLine("2回目の呼び出し");
                IAsyncResult arGetPrice;
                arGetPrice = proxy.BeginGetPrice("msft", GetPriceCallback, proxy);
            }

            // メソッド呼び出しが2回完了するまで、プログラムが終了しないようにする
            Thread.Sleep(10000);

            proxy.Close();
            Console.WriteLine("完了しました。");
        }

        /// <summary>
        /// 3秒かかるメソッド
        /// </summary>
        /// <param name="ar"></param>
        static void GetPriceCallback(IAsyncResult ar) {
            double d = ((StockServiceClient) ar.AsyncState).EndGetPrice(ar);
            Thread.Sleep(3000);
        }
    }
}

アプリ実行


1回目の呼び出しが完了する前に2回目が呼び出されています。


両方の処理が完了しました。

参考

IAsyncResult インターフェイス (System)
非同期操作のステータスを表します。 ...

IAsyncResult.AsyncState プロパティ (System)
非同期操作についての情報を限定または格納するユーザー定義のオブジェクトを取得します。 ...

AsyncCallback デリゲート (System)
非同期操作の完了時に呼び出されるコールバック メソッドを参照します。 ...