C# 搜索子曲面的问题

C# 搜索子曲面的问题,c#,multithreading,loops,C#,Multithreading,Loops,我从网上截取了这个sub,以递归方式搜索所有文件,包括子目录 如果我将此sub指向一个大区域(即mydocuments或C:),我会得到一个错误: CLR无法转换 从COM上下文0x1f6c48到COM 上下文0x1f6db8持续60秒。这个 拥有目标的线程 上下文/公寓是最有可能的 进行非泵送等待或 处理一个非常长的运行时间 无泵送窗操作 信息。这种情况普遍存在 对绩效产生负面影响,并可能 甚至导致应用程序变得 无响应或内存使用 随着时间的推移不断积累。到 避免这个问题,所有的单 螺纹单元(S

我从网上截取了这个sub,以递归方式搜索所有文件,包括子目录

如果我将此sub指向一个大区域(即mydocuments或C:),我会得到一个错误:

CLR无法转换 从COM上下文0x1f6c48到COM 上下文0x1f6db8持续60秒。这个 拥有目标的线程 上下文/公寓是最有可能的 进行非泵送等待或 处理一个非常长的运行时间 无泵送窗操作 信息。这种情况普遍存在 对绩效产生负面影响,并可能 甚至导致应用程序变得 无响应或内存使用 随着时间的推移不断积累。到 避免这个问题,所有的单 螺纹单元(STA)螺纹 应该使用泵送等待原语 (如CoWaitForMultipleHandles)和 在长时间内定期发送消息 运行操作

这是密码 (我认为这是因为潜艇在呼唤自己)


尝试在单独的线程中运行该代码,以便在搜索过程中不会阻塞UI。是最简单的方法。

不要使用递归函数,只需使用Directory.GetFiles的一个重载即可

Directory.GetFiles(sdir, null, SearchOption.AllDirectories);

GetFiles方法具有允许递归搜索的覆盖。我会尝试使用它,看看你的问题是否消失

void DirSearch(string sDir)
{
    try
    {
        var files = System.IO.Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories);
        foreach (string f in files)
        {
            string hash = GetMD5HashFromFile(f);
            Dic_Files.Add(f, hash);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}
调试问题

根据:


您看到的是一个“托管调试助手”(MDA),可以通过调试->异常…>展开MDA节点并取消选中contextswitchdeadlock复选框。

看起来像是一个相当无害的目录扫描例程。如果可行,请发布异常的调用堆栈以及GetMD5HashFromFile()的实现,好吗?这是更简单的代码,很好的调用。但是,他遇到的问题是搜索本身花费的时间太长,需要在一个单独的线程上完成。我看到了这个选项,但是如果一个目录出错,它就会崩溃,所以它真的不实用。我看到了这个选项,但是如果一个目录出错,它就会崩溃,所以它真的不实用。这真的解决了问题吗?或者调试问题是否意味着它只是我调试时的一个问题?代码错误是正确的。参考本文,这是关于试图检测多线程系统中死锁的调试器问题。
void DirSearch(string sDir)
{
    try
    {
        var files = System.IO.Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories);
        foreach (string f in files)
        {
            string hash = GetMD5HashFromFile(f);
            Dic_Files.Add(f, hash);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}