Async/Await vs Parellel.For,在这种情况下哪个更好?

use*_*953 5 .net c# multithreading asynchronous

所以我有1000件物品来检查它们是否是最新的.这些项目中的每一项都需要读取数千个文件(其中一些文件可能是不同项目中的相同文件).

目前,这是使用TPL(异步/等待)的实现,一个用于每个必须读取的文件,一个用于它必须检查的每个项目.这工作正常,除了我描述它时,关于第3个最昂贵的函数是线程池中的TrySteal.

使用visual studio并发查看器,我看到99%的线程花费在并发相关项目上,而执行时只有1%.正是这一点让我觉得我可能只是创造了太多的任务(注意:我没有在任何地方使用Task.Run,​​只是等待).

Parellel.For是否比使用async/await读取一堆文件要少得多?使用任务编程库需要多少开销?

Ale*_*nko 1

如果您正在检查硬盘驱动器上的文件,我认为该任务的并行性不是很好。如果您尝试同时读取数千个文件,只会使进程变慢,因为它无法同时读取那么多文件,更糟糕的是,它无法将太多文件缓存到内存中。在不优化检查过程本身的情况下,最快的选择应该是连续运行它。如果您确实想优化它,我建议循环遍历文件,检查每个项目,而不是循环遍历项目,检查每个文件。在这种情况下,即使在多个线程中执行它也可能是有效的(但不是同时执行)。

更新:如果您有足够的内存来缓存所有文件,那么它不会限制多线程那么多。尽管如此,我还是建议限制并行线程的数量,与您要使用的处理器核心的数量相当。最好使用 Parallel.ForEach() 来完成此操作。另外,Parallel.Foreach() 明确指出,您的循环是异步的,因此代码会更容易理解。