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

C# Async/Await与Parellel.For,在这种情况下哪个更好?,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,所以我有1000个项目要检查它们是否是最新的。这些项目中的每一项都需要读取数千个文件(其中一些可能是跨不同项目的同一文件) 目前,这是使用TPL(异步/等待)实现的,一个用于它必须读取的每个文件,一个用于它必须检查的每个项目。这工作得很好,除了在我分析它时,线程池中第三昂贵的函数是TrySteal 使用VisualStudio并发查看器,我看到99%的线程时间花在并发相关的项目上,只有1%的线程时间花在执行上。这让我觉得我可能只是创建了太多的任务(注意:我不使用任务。在任何地方运行,只需等待)

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

目前,这是使用TPL(异步/等待)实现的,一个用于它必须读取的每个文件,一个用于它必须检查的每个项目。这工作得很好,除了在我分析它时,线程池中第三昂贵的函数是TrySteal

使用VisualStudio并发查看器,我看到99%的线程时间花在并发相关的项目上,只有1%的线程时间花在执行上。这让我觉得我可能只是创建了太多的任务(注意:我不使用任务。在任何地方运行,只需等待)


与使用async/await读取一堆文件相比,Parellel.For的开销会更小吗?使用任务编程库需要多少开销?

如果您正在检查硬盘上的文件,我认为此任务的并行性不是很好。如果您试图同时读取数千个文件,只会使过程变得更慢,因为它无法同时读取那么多文件,更糟糕的是,它无法将太多文件缓存到内存中。 最快的选择,没有检查过程本身的优化,应该只是连续运行它。 如果你真的想优化它,我建议循环检查文件,检查每个项目,而不是循环检查项目,检查每个文件。在这种情况下,甚至可以在多个线程中执行此操作(但不是同时执行所有线程)

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

您是否检查了资源监视器(可通过Windows任务管理器上的“性能”选项卡获得)以查看您是否达到了磁盘子系统的性能要求?如果是这样,你可能需要重新思考这个问题。缓存数据,使用多个驱动器,使用适当的RAID集,SSD。可能两者都没有。相反,您可能需要考虑TPL数据流,因为您可以以适合于I/O操作的方式限制每个块中的消息,因为TIME有四个硬件突击SSD,并且由于90%的文件已经在内存中,磁盘几乎没有滴答作响。但是,所有程序同时运行时,cpu使用率为100%,因此我试图通过降低cpu使用率来进行优化。任务调度程序似乎是其中的一个重要部分。在这种情况下,大多数文件都可以放在内存中(它们很可能已经在内存中)。即使文件在内存中,是否也适用相同的建议?在内存中,我的意思是它们可能在备用列表中,因为它们刚刚被之前的进程使用过。@user2460953不,我的建议不适用。我更新了我的答案。因为我有多个项目可能希望在同一个文件中读取,所以我假设我应该在表示该文件的对象上的并行for循环中执行锁定,对吗?这样,如果两个项目要对同一个文件进行散列,一个项目获胜,另一个项目在锁解析后看到该文件已被散列。@user2460953在您的情况下,很难判断它是否是有效的优化。但是,如果您对每个文件都执行相同的任务,为什么不创建一个完整的文件列表,然后(在一个或多个线程中)处理它们呢?这可能会大大简化逻辑,让您更容易优化流程。