TPLに関するドキュメントと多くのチュートリアルを読みましたが、達成したいモデルをカバーしているものはありません。
一部のアルゴリズムでは、常に反復回数が固定されていました。
常に実行中のスレッドが必要です (できるだけ多く):
while(真)
- MAIN スレッドからデータを取得する
- 時間のかかる重いタスクを実行する (別のスレッドで)
- メインスレッド情報を更新
さらに、目覚まし時計を設定できるメカニズムが必要です(たとえば、5秒)。5 秒後、すべての作業を一時中断してから再開する必要があります。
同じタスクで Task.ContinueWith を使用する必要がありますか? しかし、私は前のタスクの起動の結果を処理していませんが、代わりにメインスレッドのデータ構造を更新してから、新しいタスクの反復の入力になるものを決定します...
最高の効率を得るためにいくつのタスクを作成する必要があるかをTPLの決定に任せるにはどうすればよいですか?
いいえ、私は BackgroundWorkers を使用しています。なぜなら、彼らには素晴らしい RunEventCompleted イベントがあるためです。その内部ではメイン スレッドにいるので、MAIN 構造を更新し、時間の制約を確認し、最終的に完了した BackgroundWorker で StartAsync を再度呼び出すことができます。それは素晴らしく明確ですが、おそらく非常に非効率的です。マルチプロセッサ、マルチコア サーバーで高効率にする必要があります。
1 つの問題は、計算が常にオンラインであり、停止しないことです。MAIN構造の現在の状態をリモートで尋ねることができるネットワークもあります。
2番目の問題は、重要な時間制御です(正確なタイマーが必要です-停止すると、スレッドを再開できなくなります)。それが終了した後、特別な優先度の高いタスクが来て、すべての作業が再開されます。
3 つ目の問題は、実行する操作に上限がないことです。
私が観察したところによると、これらの 3 つの制約は TPL にうまく適合しません。コレクションはタスク自体の結果によってリアルタイムで変更されるため、Parallel.For のようなものは使用できません...結合方法もわかりません:
- 作成するスレッド数を TPL に決定させる機能
- スレッドのライフタイム実行の一種 (連続する再起動間の一時停止と同期ポイント)
- スレッドを最初に 1 回だけ作成する (常に新しいパラメーターを使用してのみ再起動する必要があります)
誰かが私に手がかりを与えることができますか? 私はそれを悪い、非効率的な方法で行う方法を知っています。私が説明したいくつかの小さな要件があり、これを正しく行うことができません。私は少し混乱しています。