Architect's Log

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

WCFでクライアントからサービスへの一方向の操作を実装する

エッセンシャルWCF P.41より引用

クライアントからサービスの一方向メソッドを呼び出す(もう少し正確に表現すれば、クライアントから一方向操作に設定されているサービスエンドポイントにメッセージを送信する)、サービスの操作が完了しなくても呼び出し元に制御が戻ります。

検証してみましょう。

サービス

これまでのエントリと同じ要領でサービスを作成します。クラスライブラリで実装し、IISにホストします。

using System.ServiceModel;
using System.Threading;

namespace HelloWorld {
    [ServiceContract]
    public interface IStockService {
        [OperationContract(IsOneWay = true)]    // 一方向
        void DoBigAnalysisFast(string ticker);

        [OperationContract]
        void DoBigAnalysisSlow(string ticker);
    }

    public class StockService : IStockService {
        public void DoBigAnalysisFast(string ticker) {
            Thread.Sleep(10000);
        }

        public void DoBigAnalysisSlow(string ticker) {
            Thread.Sleep(10000);
        }
    }
}

クライアント

これまでのエントりと同じ要領でサービスを参照し、プロキシクラスとapp.configを作成します。

using System;
using HelloWorldClient.ServiceReference;

namespace HelloWorldClient {
    class Client {
        static void Main(string[] args) {
            StockServiceClient proxy = new StockServiceClient();
            {
                Console.WriteLine("1回目の呼び出し");
                proxy.DoBigAnalysisFast("hoge");
                Console.WriteLine("1回目の呼び出しからの制御戻り");
            }
            {
                Console.WriteLine("2回目の呼び出し");
                proxy.DoBigAnalysisSlow("hoge");
                Console.WriteLine("2回目の呼び出しからの制御戻り");
            }
        }
    }
}

アプリ実行


1回目に呼び出したメソッドは一方向なので、呼び出し完了のまえに、2回目が呼び出されています。

両方とも完了しました。