「エージェント」クラスを持つC#プログラムがあります。このプログラムは複数のエージェントを作成し、各エージェントには「run()」メソッドがあり、タスクを実行します (つまり、Task.Factory.StartNew() ...)。
各エージェントはいくつかの計算を実行し、次の段階に進む前に、他のすべてのエージェントが計算を完了するのを待つ必要があります (彼のアクションは、他のエージェントの計算に基づいています)。
Agent を待機させるために、CancellationTokenSource (「tokenSource」という名前) を作成し、この Agent がスリープ状態になることをプログラムに警告するために、イベントをスローしました。したがって、2 つの連続するコマンドは次のとおりです。
(1) OnWaitingForAgents(new EventArgs());
(2) tokenSource.Token.WaitHandle.WaitOne();
(イベントは、それ自体がスレッドである「AgentManager」クラスによってキャッチされます。2 番目のコマンドは、キャンセル トークンのシグナルが受信されるまで、エージェント タスク スレッドをスリープ状態にします)。
上記のイベントが発生するたびに、AgentManager クラスがそれをキャッチし、カウンターに +1 を追加します。カウンターの数がプログラムで使用されるエージェントの数と等しい場合、AgentManager (すべてのエージェントへの参照を保持する) は、次のように各エージェントを起動します。
agent.TokenSource.Cancel();
ここで私の問題に到達します。最初のコマンドはエージェントによって非同期的に実行され、スレッド間のコンテキストの切り替えにより、AgentManager がイベントをキャッチしたように見え、すべてのエージェントを起動します。しかし - 現在のエージェントはまだ 2 番目のコマンドに到達していません。このように、エージェントは「起床」信号を受信し、それから初めて眠りにつくことになります。2 つの連続するメソッドをまとめて「原子化」する方法はありますか? そのため、コンテキストの切り替えは発生せず、AgentManager が彼を起こす前にエージェントを強制的にスリープ状態にしますか?