1

次の for ループがあります。

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();

for (int i = 0; i < packets2.Count; i++)
{                       
    dosimulationasync(packets2[i]);                        
}

stopwatch.Stop();                    
logit("Time: " + stopwatch.ElapsedMilliseconds);

は次のdosimulationasyncようなものです。

private async Task dosimulationasync(SimulationPoint mypoint)
{
    await TaskEx.Run(() =>
    {
        for (int i = 0; i < allobjects.Count; i++)
        {
            if (allobjects[i].ID == mypoint.ID)
            {
                allobjects[i].setvalue(mypoint);
                break;
            }
        }
    });
}

問題は、 でキャッチする最初の for ループが、stopwatch処理しなければならない値が増えるほど非常に遅くなることです (13 個の値がすでに約 300 ミリ秒かかります)。メソッドを非同期で呼び出すことでdosimulationasync、最初の for ループが一気に続くのではないかと考えました。

ルーチンが遅い場合でもdosimulationasync、最初の for ループに影響を与えるべきではありません。

私は何を間違っていますか?どうすれば「発送」できdosimulationasyncますか?

4

1 に答える 1

0

あなたの場合、async/awaits は役に立たないと思います。並列方式は dosimulationasync ですが、並列処理するものは何もありません。async/await を完全に削除し、メイン メソッドで Parallel.For を使用します。

Parallel.For(0, packets2.Count, (i) =>
{                       
    dosimulationasync(packets2[i]);                        
});

ただし、packets2 からの並列読み取りができることを確認してください

于 2012-10-18T16:23:00.120 に答える