0

ユーザーが次のようなことができる webservice+servicebus プロジェクトを作成しています

public void ExecuteLongProcess(DateTime fromDate,string aggregateId){}

このメソッドはすぐに戻りますが、バスを介して操作の要求を送信します。

私の問題は、別のユーザーが既に実行されているときに、複数のユーザーが同じ aggregateId で長いプロセスを要求したときに始まります。

私が考えている解決策は、継続的Queue<LongProcessTask>に実行され、実行する必要がある操作を探すタスクです。そのため、一度に1つのプロセスのみを実行するか、将来の実装は異なるaggregateIdの場合は複数のプロセスになります。

このようにして、同じ集計で長時間実行されるプロセスが重複することはありません。

他のアイデア?

4

2 に答える 2

0

あなたの答えでは、複数のスレッドが並行キューからタスクを受け取ると言っています。この場合、同じ aggregateId を持つ 2 つのタスクが同時に実行される可能性があります。これが問題になるかどうかはわかりません。問題がある場合は、aggregateId ごとに異なるキューを使用する必要があります。

タスクの順序が問題にならない場合は、BlockingCollectionを使用することをお勧めします。質問があるため: 同時キューにタスクがない場合、複数のコンシューマ スレッドで何をする予定ですか。

while(some_condition_to_keep_thread_alive)
{
  if(!queue.TryDequeue(...))
    continue;
  else 
  {
    //do the job
  }
}

queueが空の場合、このコードはコアを狂わせます。ブロックメカニズムが必要です。BlockingCollection がこれを行います。

ConcurrentQueue の使用を主張しますか? わかりました SemaphoreSlimはあなたの友達です。

于 2011-11-03T10:06:38.287 に答える
0

同時実行キューを調べて保留中の各操作を実行する連続実行タスク (プロセッサ コアに応じた数) をインスタンス化する TaskRunner を作成しました。TaskRunner は、Windsor から各操作タイプのハンドラーを取得して、クラス内の各操作の処理を脇に置きます。

于 2011-11-03T09:19:47.770 に答える