0

serviceType クラスをシングルトンとして初期化する Windows Communication Foundation サービス (この場合の appDomain は Windows フォーム アプリケーション) を作成しました。

サービスの開始は機能します。クライアントからの呼び出しは機能します。しかし、サービスが上記のコードで自分自身を呼び出すと (「//サービスへの最初の呼び出しを行いますか?」)、System.TimeoutException が発生します。

private static myDataService.DataProvider.CustomSingletonClass obs;

public DataProviderServiceType()
{

    //Create the object if needed.  This should only be required first time.
    if (obs == null)
    {
        obs = new myDataService.DataProvider.CustomSingletonClass();
        //Instruct the class to read its configuration and initialize.                       

        obs.initializeSingletonClass(null);

    }

}

シングルトン クラスには、初期化時に開始されるタイマー オブジェクトがあります。したがって、クライアントがサービスに対して呼び出しを行うと、クラスがインスタンス化され、タイマーが開始され、オブジェクトはタイマー オブジェクトを定期的に起動して存在し続けます。

文脈上、タイマーのイベントはシングルトンのプロパティを更新します。目的は、シングルトン クラスが定期的に計算を実行し、そのプロパティにデータを保持し、プロパティにあるものを呼び出し元のクライアントに返すことです。このようにして、定期的な (時間ベースの) 計算を実行するための呼び出しが制限され、すべてのクライアントが同じ更新されたデータを受け取ります。

問題は、サービスがホストされると、単一のインスタンスを作成してタイマーを開始するための呼び出しを行うクライアントが 1 つだけで済むことです。

SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");

リクエストを行う最初のクライアントが構成と初期化が行われるのを待つ必要がないように、サービスが 1 回の呼び出しでシングルトン クラスを初期化することを望みます。プログラムの起動時に更新されるデータ。「SetListText("サービスを利用できるようになりました。");」の直後 私は以下を持っています:

//Make the 1st call to the service?
EndpointAddress endpointAddress = new     EndpointAddress("http://localhost:8000/myDataService/DataProvider/TimedCalculator");
BasicHttpBinding serviceBinding = new BasicHttpBinding();

serviceBinding.CloseTimeout = new TimeSpan(0, 1, 0);
serviceBinding.OpenTimeout = new TimeSpan(0, 1, 0);
serviceBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
serviceBinding.SendTimeout = new TimeSpan(0, 1, 0);

DataProviderClient client = new DataProviderClient (serviceBinding, endpointAddress);
String[][] ArrStr = client.retrieveList();

WCF サービスが同じ appDomain でそれ自体を呼び出す方法はありますか、それともこれは合理的に望ましくありませんか? この自己呼び出しコードを放棄し、最初のクライアントのサービス コールをそのまま使用する理由はありますか?

4

1 に答える 1

1

私はこれを少し違う方法で行います。これを試して:

  • シングルトン WCF サービスを使用してドロップする
  • Enterprise Library をキャッシュに使用する
  • WCF サービスで、キャッシュ内のデータが十分に新しいかどうかを確認し、そうである場合はそれを返し、そうでない場合はデータを取得/再計算します。
  • 特定の時間間隔で WCF サービスをポーリングする Windows サービスを作成します。

時間間隔が十分に短い場合、Windows サービスが再生成の仕事をしているのが普通です。

このパターンのバリエーションもあります。

  • Windows サービスは再キャッシュ データ サービスを呼び出します
  • Windows サービスの代わりにキャッシング プロキシ製品を使用する
于 2009-07-13T10:46:47.077 に答える