5

の配列を定義し、Action<string, int, double, double>を使用して並列に実行したいと考えていParallel.Invoke()ます。これを行うことができるように、アクションをパラメーターなしのアクションにキャストできる方法はありますか、それとも別の方法がありますか?

4

2 に答える 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 に答える