为什么这个异步for循环慢?

时间:2012-10-18 16:09:54

标签: c# loops asynchronous for-loop

我有以下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

1 个答案:

答案 0 :(得分:0)

我认为在你的情况下,async / awaits对你没有帮助。 并行方法是dosimulationasync,但它没有任何内容可以并行处理。 我会完全删除async / await并在你的main方法中使用Parallel.For:

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

但请确保您可以从packets2

进行并行读取