2009-08-13 2 views
0

ich diese Unter aus dem Web snaged rekursiv alle Dateien einschließlich subdirectoiresProblem mit der Suche subdirs

Wenn ich diese Unter auf eine große Fläche Punktsuche (dh mydocuments oder C :) Ich erhalte eine Fehlermeldung:

Hier

The CLR has been unable to transition from COM context 0x1f6c48 to COM context 0x1f6db8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.

ist der Code (I seine glauben, weil die Unter selbst ruft)

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

Sieht aus wie eine ziemlich harmlose Verzeichnis-Scan-Routine. Könnten Sie bitte den Aufruf-Stack der Exception sowie die Implementierung von GetMD5HashFromFile() posten, wenn möglich? –

Antwort

0

debugging Problem.

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

Was Sie sehen, ist einer von „Managed Debugging Assistants“ (MDA) und kann durch Debug-> Ausnahmen deaktiviert werden ...> Erweitern Sie den MDA-Knoten und entfernen Sie das Häkchen gegen contextswitchdeadlock .

+0

macht das wirklich das Problem? oder bedeutet Debugging-Problem, dass es nur ein Problem ist, während ich debugge bin? – Crash893

+0

Code loks wie korrekt. Referenzieren Sie diesen Schritt http://groups.google.com/group/microsoft.public.vsnet.debugging/browse_thread/thread/1e4ac1010ae5920d/03ca1c82ea79287b?pli=1 Es ist alles über Debugger-Problem versucht Deadlocks in Multi-Thread-System zu erkennen. –

0

Versuchen Sie, dass Code in einem separaten Thread ausgeführt wird, so dass Sie nicht über Ihre UI blockieren während der Suche. BackgroundWorker ist der einfachste Weg, dies zu tun.

0

Statt eine rekursive Funktion zu verwenden, verwenden nur eine der Überlastung der Directory.GetFiles

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

Das ist einfacher Code, netter Anruf. Das Problem, das er hat, ist jedoch, dass die Suche selbst zu lange dauert und in einem separaten Thread erledigt werden muss. –

+0

Ich sah diese Option, aber es stürzt ab, wenn ein dir falsch geht, ist es wirklich nicht praktikabel – Crash893

1

GetFiles Die Methode hat eine Überschreibung, die für die rekursive Suche ermöglicht. Ich würde versuchen, das zu verwenden und zu sehen, ob dein Problem weggeht ...

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

Ich sah diese Option, aber es stürzt ab, wenn ein dir falsch geht, ist es wirklich nicht praktikabel – Crash893