我有一个应用程序构建(使用多个不同进程)的 procmon 跟踪,该应用程序在某些时候无法写入文件,因为它正在被另一个进程使用。我看到的第一件事是该文件在构建开始时被删除:
\n\n3:49:32.9928378 PM foo.exe 11460 QueryOpen SUCCESS CreationTime: 8/26/2016 12:49:00 PM, LastAccessTime: 8/26/2016 12:49:00 PM, LastWriteTime: 8/26/2016 12:49:05 PM, ChangeTime: 8/26/2016 12:49:06 PM, AllocationSize: 57,344, EndOfFile: 56,624, FileAttributes: N\n3:49:32.9929337 PM foo.exe 11460 CreateFile SUCCESS Desired Access: Read Attributes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened\n3:49:32.9929791 PM foo.exe 11460 QuerySecurityFile SUCCESS Information: 0x20\n3:49:32.9930238 PM foo.exe 11460 QueryAttributeTagFile SUCCESS Attributes: N, ReparseTag: 0x0\n3:49:32.9930526 PM foo.exe 11460 SetDispositionInformationFile …Run Code Online (Sandbox Code Playgroud) 所以我有1000件物品来检查它们是否是最新的.这些项目中的每一项都需要读取数千个文件(其中一些文件可能是不同项目中的相同文件).
目前,这是使用TPL(异步/等待)的实现,一个用于每个必须读取的文件,一个用于它必须检查的每个项目.这工作正常,除了我描述它时,关于第3个最昂贵的函数是线程池中的TrySteal.
使用visual studio并发查看器,我看到99%的线程花费在并发相关项目上,而执行时只有1%.正是这一点让我觉得我可能只是创造了太多的任务(注意:我没有在任何地方使用Task.Run,只是等待).
Parellel.For是否比使用async/await读取一堆文件要少得多?使用任务编程库需要多少开销?