搜索子目录的问题

时间:2009-08-13 17:43:32

标签: c# multithreading loops

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

如果我将此子指向大区域(即mydocuments或C :),我会收到错误:

  

CLR无法过渡   从COM上下文0x1f6c48到COM   上下文0x1f6db8持续60秒。该   拥有目的地的线程   上下文/公寓是最有可能的   或者做一次非抽水等待或者   处理很长时间   没有泵Windows的操作   消息。这种情况一般都有   负面的业绩影响和可能   甚至导致应用程序成为   无响应或内存使用   随着时间的推移不断积累。至   一切都避免这个问题   线程公寓(STA)线程   应该使用抽等待原语   (例如CoWaitForMultipleHandles)和   经常在长时间内发送消息   正在运行。

这是代码 (我相信它是因为潜意识自己)

void DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                string hash = GetMD5HashFromFile(f);
                Dic_Files.Add(f, hash);
            }
            DirSearch(d);
        }
     }
     catch (System.Exception excpt)
     {
         Console.WriteLine(excpt.Message);
     }
 }

4 个答案:

答案 0 :(得分:1)

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);
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不使用递归函数,只需使用Directory.GetFiles的重载之一

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

答案 3 :(得分:0)

调试问题。

根据:http://social.msdn.microsoft.com/forums/en-US/vsdebug/thread/ed6db6c8-3cdc-4a23-ab0a-2f9b32470d35/

您所看到的是“托管调试助手”(MDA)之一,可以通过Debug-> Exceptions ...>禁用。展开MDA节点并取消选中contextswitchdeadlock的框。