我有以下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
?
答案 0 :(得分:0)
我认为在你的情况下,async / awaits对你没有帮助。 并行方法是dosimulationasync,但它没有任何内容可以并行处理。 我会完全删除async / await并在你的main方法中使用Parallel.For:
Parallel.For(0, packets2.Count, (i) =>
{
dosimulationasync(packets2[i]);
});
但请确保您可以从packets2
进行并行读取