0

私が開発しているアプリは次のように構成されています。プロデューサー タスクはファイル システムをスキャンしてテキスト ファイルを探し、それらへの参照をバッグに入れます。多くのコンシューマー タスクは、同時にバッグからファイル参照を取得し、ファイルを読み取ります (そして、その内容に対していくつかの短い作業を行います)。

プロセス全体を一時停止して再開できる必要があります。

私はTPLを使用して、バッグに入れられるすべてのファイル参照のタスクを作成してみました(この場合、バッグは単なる概念であり、プロデューサーはファイルを見つけるときにコンシューマータスクを直接作成します)が、この方法ではできません作成したタスクを制御できず、一時停止できません (または一時停止する方法がわかりません)。現在タスクを実行しているスレッドを一時停止するコードを書くことはできますが、手動でスレッドを作成するのではなく、論理タスクを操作するポイントが台無しになりますよね? 「物理スレッドに既に割り当てられているタスクは完了できますが、待機中の論理タスクは再開コマンドまで開始しないでください」のようなものが必要です

どうすればこれを達成できますか? TPLでそれを行うことができますか、それとも他のものを使用する必要がありますか?

編集: あなたの答えはすべて有効ですが、私の主な疑問は未解決のままです. TPL を使用すると、プロデューサと多くのコンシューマはスレッドではなくタスク (そうですか?) になります (まあ、実行の時点では、タスクはスレッドにマップされます)。私が見つけたすべての同期メカニズム(コメント「ManualResetEventSlim」で提案されているものなど)はスレッドレベルで機能します。

たとえば、「ManualResetEventSlim」の Wait() メソッドの説明は、「現在の ManualResetEventSlim が設定されるまで現在のスレッドをブロックする」です。

タスクに関する私の知識は純粋に学術的なものであり、「現実世界」で物事がどのように機能するかはわかりませんが、タスクレベルまたは物事でタスクを調整 (待機/信号/...) する方法が必要であることは論理的に思えます奇妙になる可能性があります...のように... 2つのタスクが同じスレッドにマップされている可能性がありますが、1つは待機していた他のタスクにシグナルを送ることになっていて、デッドロックしました。私は少し混乱しています。これが、私のアプリが古いスタイルの単純なスレッドの代わりに TPL を使用できるかどうかを尋ねた理由です。

4

2 に答える 2

0

確かに、これには TPL を使用できます。また、リアクティブ拡張機能と LINQ を使用して、スレッドのグループ化と一時停止/再開を簡素化することもできます。

各ファイルに短いジョブしかない場合は、キャンセルでハンドラー関数を妨害しないことをお勧めします。代わりに、ワーカーのキューイングを一時停止することができます。

私は次のようなものを想像します:

  • ディレクトリスキャナースレッドは、見つかったファイルを監視可能なコレクションに入れます。
  • コンシューマー スレッドは、コレクションの変更をサブスクライブし、ファイルを取得/削除してワーカーに割り当てます。
于 2013-08-20T15:32:51.843 に答える