0

ランタイム中にコンシューマーが変更される可能性があるプロデューサー/コンシューマーの状況に合わせて、ラウンド ロビン ベースのスケジューリングを実装したいと考えています。

最初は、Queueすべてのコンシューマーを含む を使用し、1 つをキューから取り出し、すぐに再度キューに入れ、循環コレクションを作成しましたが、完全に機能しました。新しいコンシューマーが登録されるたびに、それをキューに入れました->完了。

ただし、実行時 (サブスクライブ解除メッセージを送信するとき) にコンシューマーを削除するという問題は困難です。Queue は Remove() メソッドを提供しませんが、キュー内のコンシューマーの現在の位置とは関係なく、それらをキューから完全に削除する必要があります。明らかに、Queueインターフェース」はまさに私が必要としているものではありません。

私が聞いたことのない C# には、ある種の「循環コレクション」がありますか?

4

2 に答える 2

0

dasblinkenlight の回答を読んだ後、私は現在LinkedListベースのアプローチを使用しています。

  • AddConsumer -> linkedList.AddLast
  • RemoveConsumer -> linkedList.Remove
  • GetNextConsumer

    var next = linkedList.First.Value; linkedList.RemoveFirst(); linkedList.AddLast(次); 次に戻ります。

これでうまくいきます。RemoveConsumer は O(N) ですが、remove はめったに発生しないため、それほど悪くはありません。

于 2013-09-08T16:54:06.123 に答える