1

消費する WCF サービスの呼び出しに関するアーキテクチャに関する質問があります。

現在、私の WCF サービスには、SubmitJob と ProcessQueueJobs の 2 つの関数が含まれています。

  1. SubmitJob はジョブを 1 つのキューに入れます。これは多くのクライアントから呼び出される可能性があります。
  2. ProcessQueueJobs はキュー内のすべてのジョブを処理します。このメソッドにサービス コントラクトを設定したくありません。また、SubmitJob が ProcessQueueJobs を呼び出したくありません。

したがって、私が ProcessQueueJobs を呼び出す最も簡単な方法は、サービス コントラクトを作成し、単純なコンソール アプリでワープして、数分ごとに実行するようにスケジュールすることです。ProcessQueueJob をクライアントに公開したくないので、このソリューションはあまり好きではありません。では、WCF サービスをホストするプロセス内で ProcessQueueJobs を実行する最善の方法は何でしょうか?

4

1 に答える 1

0

WCF インターフェイスで使用されるコントローラー クラスがあります (SOAP および REST インターフェイスがあります)。

そのため、誰かが を呼び出すと、SubmitJobそれをコントローラーに渡します。

コントローラー関数では、それをキューに保存します。

現在、私のプロジェクトには、このクラスで定義されているキューがあります。

public static class WebServiceControllerStatic
{
   static ConcurrentQueue<WebServiceModels.Job> jobqueue = new ConcurrentQueue<WebServiceModels.Job>();

次に、これらの 2 つの方法があります。1 つは情報をキューに入れ、もう 1 つはスレッドを開始してキューを処理します。

    public static WebServiceModels.Job[] JobQueue
    {
        set
        {
            value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
        }
    }
    public static void ProcessUpdateJobQueue()
    {
        Action UpdateJob = () =>
        {
            if (jobqueue.IsEmpty)
                return;
            int cnt = 0;
            Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 20 },
                (j) =>
                {
                    cnt++;
                });
        };
        if (processUpdateJobThread == null)
        {
            processUpdateJobThread = new System.Threading.Thread(() =>
            {
                while (true)
                {
                    UpdateJob();
                    UpdateJob();
                    System.Threading.Thread.Sleep(10000);
                }
            });
            processUpdateJobThread.Start();
        }
    }

そして、私のコントローラーメソッドでは、あなたの場合、SubmitJob 呼び出しが行われるたびに、これを呼び出します。

WebServiceControllerStatic.JobQueue = jobs;
WebServiceControllerStatic.ProcessUpdateJobQueue();

そのため、処理する必要があるものを保持する 1 つのキューと、キューにあるものを処理するために頻繁に起動するスレッドがあります。

そして、これは私のニーズに適しています。

ConcurrentQueue を使用した主な理由は、キューの更新と削除を同時に行うためです。

于 2012-08-30T15:04:00.040 に答える