の配列を定義し、Action<string, int, double, double>
を使用して並列に実行したいと考えていParallel.Invoke()
ます。これを行うことができるように、アクションをパラメーターなしのアクションにキャストできる方法はありますか、それとも別の方法がありますか?
質問する
7219 次
2 に答える
7
これを試すことができます:
Parallel.Invoke(() =>
{
YourFirstAction(param1, param2, param3, param4);
}, // close first Action
() =>
{
YourSecondAction(param1, param2, param3, param4);
}//close second Action
); //close parallel.invoke
于 2012-04-26T22:10:13.693 に答える
1
パラメータ値を送信せずにアクションを実行しても問題ないのに、なぜアクションにパラメータがあるのか、私は混乱しています。デフォルト値で Parallel.ForEach を使用するのがおそらく最善でしょう。
Action<string, int, double, double>[] actions;
// Action array, actions, set somewhere in code.
Parallel.ForEach(actions, action => action(string.Empty, 0, 0, 0));
パラメータを送信する場合は、必要に応じて値を置き換えます。
テストには次のアクションを使用しました。
Parallel.For(0, actions.Length, index => actions[index] = (s, i, d1, d2) => Thread.Sleep(100));
Parallel.For(0, parameterless.Length, index => parameterless[index] = () => Thread.Sleep(100));
長さ 20 秒の配列の結果:
Parallel.Invoke: 0.3000709
Parallel.ForEach: 0.3022143
通常の for ループ: 2.0000706
そのため、Parallel.Invoke には、パラメーターのないアクションを使用するという利点があります。これはパフォーマンスにわずかに影響しますが、大きな影響はありません。
念のため、Parallel.ForEach を使用してパラメーターなしの Action 配列をテストしたところ、結果は Parallel.Invoke とほぼ同じで、結果は 0.300979 秒でした。
于 2013-03-25T01:55:57.257 に答える