0

大量のデータをキャッシュするシングルトン WCF サービスをホストする Windows サービスがあります。Windows サービスの起動時に、次のことを行っています。

// start client service
        wcfService= new ServiceHost(typeof(MyWcfService));
        wcfService.Open();

        using (HostedServiceReference.WcfServiceProxy wcfServiceProxy = new HostedServiceReference.WcfClientServiceProxy())
        {
            wcfServiceProxy.RefreshDisplayCacheFromSource();
            // 1st echo to console
            Console.WriteLine("Display Cache Refreshed"));
        }
        // 2nd echo to console
        Console.WriteLine("Begin other processing"))

そして、サービス コントラクトで次のように構成されたメソッドがあります。

[OperationContract(IsOneWay=true)]
    void RefreshDisplayCacheFromSource();

コンソールに 1 番目と 2 番目のエコーがすぐに表示されると思っていましたが、実際に表示されているのは 1 番目のエコーだけです。2行目は、私の「ファイアアンドフォーゲット」メソッドが長い操作を完了するまで表示されません。

バックグラウンドで何が起こっているのか誰でも説明できますか?

これまでの私の理論:

シングルトン モードでの wcf サービスの操作は、それをホストしているサービスをブロックしていますか?

usingステートメントと関係がありますか?

4

2 に答える 2

1

WCF サービスのプロキシ オブジェクトは using ブロックの最後で破棄されますが、サービスがメッセージを受信したという確認をクライアントが受け取るまで、これは発生しません。メソッド本体のすべてのコードを実行するまで (大量のデータの処理を含む)、サービスは確認応答を送信しないようです。そのため、クライアントでの実行は、サービスが終了するまで using ブロックの最後で待機します。処理。

この問題を回避するために使用できた 2 つの方法があります。

プロキシ オブジェクトをクライアントのグローバル変数にします。

サーバーでスレッドをスピンオフして長い処理を処理し、サーバー メソッドがクライアントが待っている確認応答をすぐに返せるようにします。

于 2011-05-23T13:53:43.153 に答える
0

WCF 呼び出しが機能している間に他の作業を続行できるようにすることが目的の場合は、サービス参照を右クリックして [サービス参照の更新] をクリックします。非同期メソッドを生成するオプションをチェックします。

次に、wcfServiceProxy.RefreshDisplayCacheFromSourceAsync(); として呼び出します。

終了時に通知を受け取りたい場合は、イベント ハンドラーも追加できます。

于 2011-05-23T13:59:37.627 に答える