0

重複の可能性:
WCF Windows サービス - 長い操作/呼び出し元モジュールへのコールバック

Windows サービスでホストされている WCF アプリケーションがあります。basicHttpBinding を使用する必要があります。アプリケーションでは、データの長期分析を行い、顧客に変えます。

分析を実行するスレッドを作成する WCF を呼び出すことは可能ですか (このスレッドの ID はクライアントに送信されます)。

クライアントは、送信された ID を使用するというテーマで通信できる必要があり、データの準備ができているという情報を受信した場合は、ダウンロードできる必要があります。これにより、スレッドが解放されます。

この機能を実現するにはどうすればよいですか?

Ok。できます。クライアント メソッド呼び出しは、guid を支払った後でもバックグラウンドで実行され、操作の結果を保存するスレッドを作成します。これらの結果を保存するにはどうすればよいでしょうか? サービスが実行されているため、サービスを呼び出すたびに Per Call ディクショナリがリセットされます。静的データの宣言はオーバーライドできますが、それは良い考えではなかったと思います。何か案は?

namespace WCFRiskService
{
    [ServiceContract]
    public interface IRiskService
    {
        // return Thread ID
        [OperationContract]
        int GetAnalysis(AnalysisId);

        [OperationContract]
        string GetAnalysisData(int ThreadId);
    }

    public class Analysis
    {
        public GenerateAnalysis()
        {
            Thread.Sleep(20000);
            Analysis = "Generated Data";
        }
    }

    public class RiskService : IRiskService
    {
        // How can I change this, to use non-static objects ?
        static string AnalysisData = "";

        public string GetAnalysisData(int ThreadId);
        {
            return AnalysisData;
        }

        public int GetAnalysis(AnalysisId);
        {
            Analysis AObject = new Analysis();
            AObject.Tree = AnalysisTree;
            Thread workerThread = new Thread(AObject.GenerateAnalysis);
            int managedThreadId = workerThread.ManagedThreadId;

            workerThread.Start();
            while (!workerThread.IsAlive) ;

            return managedThreadId;
        }
    }
}
4

1 に答える 1

0

Guidジョブごとにジョブ ID ( ) を作成し、それをクライアントに返すことができます。次に、サービスでジョブ ID を に保存しConcurrentDictionary<Guid, AnalysisResult>、クライアントが結果を要求したときにAnalysisResult、ジョブ ID に対応する を返します。クライアントはAnalysisResult、操作によって返された が null でないかどうかなどを確認する必要があります。

ただし、ポーリングは最善の方法ではないことに注意してください。

basicHttpBinding置き換えることができる場合は、両方のエンドポイントがメッセージを送信できるようにする二重サービスwsDualHttpBindingを見てください。このようにして、サーバーはいつでもクライアントにメッセージを送信できます。進行状況レポート用のコールバック インターフェイスを作成できます。

于 2012-11-15T14:06:08.370 に答える