【发布时间】:2016-06-02 15:15:25
【问题描述】:
我正在以两种不同的方式运行 Parallel.For 循环:
-
不写任何 async/await 只是调用
Task ReadSensorAsync(int):var watch = System.Diagnostics.Stopwatch.StartNew(); Parallel.For(3, 38, index => { ReadSensorsAsync(index); }); watch.Stop(); Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);时间显示
1ms -
与
async/await一起运行var watch = System.Diagnostics.Stopwatch.StartNew(); Parallel.For(3, 38, async index => { await ReadSensorsAsync(index); }); watch.Stop(); Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);这显示
2-5ms。
问题是为什么会有这样的差异以及使用哪种方式合适。
【问题讨论】:
-
不要在没有等待结果的情况下调用异步方法。那是火,然后忘记。在异步方法中抛出的任何异常都不会被捕获,它们只会默默地失败。
-
@Pablo 如果您不等待他们,您应该写信到控制台“所有任务已启动”但不是并行完成。当您收到该消息时,parallel.for 正在做的事情仍在进行中。
-
我认为你不应该在这里使用
Parallel.For基于那个答案或这个stackoverflow.com/questions/19284202/… -
@Pablo Parallel for 也不会同时启动所有任务。它只是确保它们根据核心数量并行执行。您不妨改用 await Task.WhenAll
-
所以您使用的是 Parallel.For,然后在您调用 Task.Run 的方法中?这实际上是根据您的需要创建 2 倍的线程。
标签: c# winforms asynchronous task-parallel-library