c# - 通过网络优化 Dictionary.EnumerateFiles

标签 c# .net multithreading optimization

我目前有一个扫描网络共享的程序。为此,它首先枚举共享上的所有文件和目录。这是一个非常缓慢的过程。我目前使用以下代码,摘自本网站 2011 年的回答。

static class SafeWalk
    {
        public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
        {
            try
            {
                var dirFiles = Enumerable.Empty<string>();
                if (searchOpt == SearchOption.AllDirectories)
                {
                    dirFiles = Directory.EnumerateDirectories(path)
                                        .SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
                }
                return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine(ex.Message);
                return Enumerable.Empty<string>();
            }
        }
    }

问题在于程序中的所有其他内容都是多线程的并且针对速度进行了优化。这是唯一严重阻碍我前进的领域。枚举网络共享中的文件可能需要几十分钟。这是在内网上,我的机器和服务器之间有千兆位或更大的连接。

当我在运行时临时将网络路径映射到驱动器时​​,我确实加快了速度。我能做些什么来加快速度吗?查看资源监视器,它几乎没有使用任何 CPU、内存或网络带宽。

最佳答案

考虑使用 PInvoke 调用 FindFirstFileEx使用选项 FIND_FIRST_EX_LARGE_FETCHAccording to Raymond Chen this flag is made for your situation .

关于c# - 通过网络优化 Dictionary.EnumerateFiles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934577/

相关文章:

c# - 向 WinForm 缓慢添加许多标签

c# - 基类还是普通类?

.net - .NET Winform-多行 ListView (请参见屏幕截图)

c# - 初学者WCF实现问题

c# - 如何在 ASP.net 中处理从桌面应用程序上传的文件?

c# - 通过赎回在线程中执行 GetMessageFromID() 时,我得到 MAPI_E_UNKNOWN_ENTRYID

c++ - 线程什么时候退出?

java - 多线程同步对象

c# - 如何使用 AutoMapper 更新具有嵌套实体的实体并使用 Entity Framework 保存更新后的实体?

c# - 对象引用静态成员垃圾处理