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/await 不会帮助你。并行方法是dosimulationasync,但其中没有什么可以并行处理。我将完全删除 async/await 并在您的主要方法中使用 Parallel.For :

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

但请确保您可以从数据包2中并行读取

于 2012-10-18T16:23:00.120 回答