2

ParallelForeachアイテムのコレクションを反復処理するアクティビティがある WF 4 でワークフローを作成しています。コレクション内のアイテムごとに、カスタムの非同期アクティビティを実行して、複数のアイテムを並行して処理します。

上記の解決策は私にとってはうまくいきますが、各非同期アクティビティ インスタンスが独自のスレッドで実行されるため、使用されるスレッドの数が気になります。上記のメカニズムで parallelForeach アクティビティを実行するときに起動されるスレッドの数を構成/制御する方法はありますか?

4

2 に答える 2

2

各非同期アクティビティ インスタンスは独自のスレッドで実行されるためです。誰が言う? 確かにドキュメントではありません。

ParallelForEach はその値を列挙し、列挙するすべての値に対して Body をスケジュールします。Bodyのみをスケジュールします。ボディがどのように実行されるかは、ボディがアイドル状態になるかどうかによって異なります。Body がアイドル状態にならない場合、スケジュールされたアクティビティはスタックとして処理され、最後にスケジュールされたアクティビティが最初に実行されるため、ボディは逆の順序で実行されます。

たとえば、ParallelForEach に {1,2,3,4} のコレクションがあり、WriteLine を本体として使用して値を書き出すとします。コンソールに 4, 3, 2, 1 が表示されます。これは、WriteLine がアイドル状態にならないためです。そのため、4 つの WriteLine アクティビティがスケジュールされた後、それらはスタック動作 (先入れ後出し) を使用して実行されました

実行の並列性は、アクティビティがブックマークを作成してアイドル状態になったときにのみ発生します。それでも、実際には 2 つのアクティビティが同時に実行されているわけではありません。1 つまたは複数のアクティビティが実行を停止したため、他のアクティビティが順番に実行されます。名前からして紛らわしいのは当然ですが、それだけです。

いずれにせよ、フレームワークによる並列処理に依存している場合は、フレームワークが使用しているスレッドの数を気にする必要はありません。彼らはおそらくすべてをコントロールしています。そうでないことがわかるまで。

于 2013-01-03T20:16:17.130 に答える
0

その通りです。ParallelForEach では、ブランチごとに新しいスレッドは必要ありません。不必要にブロックしないように、AsyncCodeActivity で発生する必要があるコードでブロック I/O を実行している場合。CPU バウンドの作業を他のアクティビティと並行して実行する場合は、AsyncCodeActivity でラップするか、InvokeMethod { RunAsynchronously = true} を使用する必要があります。この場合、フレームワークはバックグラウンド スレッドで作業を実行します。

SynchronizationContext 拡張ポイントは、WF を統合する必要がある特定の既存のスレッド モデルがある場合を対象としています。この主な例には、ASP.NET のスレッド環境、および Windows Presentation Foundation/WinForms (たとえば、アクティビティを正しく機能させたい場合) が含まれます。

于 2013-01-04T22:19:35.843 に答える