1

バックグラウンドで順番に実行する必要があるタスクまたは作業項目のキューがあります。これらのタスクは「ファイア アンド フォーゲット」タイプになります。つまり、一度開始すると、完了するかどうかはあまり気にせず、キャンセルやステータスの更新は必要ありません。完了しない場合、ユーザーは手動で再試行または診断できます。

目標は、キューへの参照を保持できるようにすることです。

myQueue.Add( () => DoMyStuff() );

キューに何かを追加するため。

System.Threading.Task クラスは、共通のキューを参照することによってではなく、タスクを順番にキューに入れることしかできないようです。最新のタスクを取得してそれにアタッチするという複雑さを管理したくありません。

スレッドプールは順序付けを保証せず、作業項目を並行して実行します。(これは素晴らしいですが、私が必要とするものではありません)

私が考えていなかったものを処理できる組み込みクラスはありますか?

編集: 後でキューにタスクを追加できるようにする必要があります。シナリオは、ユーザーがボタンをクリックしたときにデバイスにコマンドを送信することです (電球をオンまたはオフに切り替えることを考えてください)。コマンドの処理には 5 秒かかります。ユーザーが複数回クリックしてリクエストをキューに入れられるようにしたいと考えています。キューに入れられるタスクの数も、そのタスクが何であるかも、事前にはわかりません。

4

3 に答える 3

3

を作成BlockingCollectionします。デフォルトではConcurrentQueue、内部データ構造として を使用します。前提条件のあるタスクには、その前提条件が最初にコレクションに追加されていることを確認してください。はBlockingCollection、 のコレクション、Task呼び出されるメソッドのパラメータを表すカスタム アイテム、実行する または などですFunc<>Action<>個人的には、またはのいずれかを使用しTaskますAction

次に、コレクション内の各アイテムを通過し、それらを同期的に実行する単一のスレッドが必要です。

作業中に新しいアイテムをキューに追加できますが、問題はありません。

于 2012-04-23T20:07:50.353 に答える
1

System.Threading.Task のラッパーとしてキュー オブジェクトを作成できます。基になるスレッド プールで同時に実行するスレッドの数を 1 つだけに制限すると、問題は解決すると思います。

実行するタスクの数を制限する: System.Threading.Tasks - 同時タスクの数を制限する

于 2012-04-23T19:53:56.400 に答える
-2

すべてのスレッドを同時に開始し、ジョブ完了イベントをリッスンするようにします。

実行するシーケンスに従ってスレッドにIDがあるとします。すべてのスレッドは同時に開始できますが、ジョブが完了するまでスリープします/前のジョブのタイムアウト

ジョブの完了/タイムアウト イベントは、監視スレッドがワーカー スレッドを追跡するのにも役立ちます。

于 2012-04-23T20:00:56.183 に答える