views:

55

answers:

4

I snaged this sub off the web to recursively search all the files including subdirectoires

If i point this sub to a large area ( ie mydocuments or C:) I get an error:

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.

Here is the code (I believe its because the sub is calling itself)

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

Try running that code in a separate thread so that you don't block your UI during the search. BackgroundWorker is the easiest way to do that.

Eric J.
A: 

Instead of using a recursive function, simply use one of the overloading of Directory.GetFiles

Directory.GetFiles(sdir, null, SearchOption.AllDirectories);
Pierre-Alain Vigeant
That's simpler code, nice call. However, the problem he's having is that the search itself is taking too long and needs to be done on a separate thread.
Eric J.
I saw this option but it crashes if one dir goes wrong so its really not practical
Crash893
+1  A: 

The GetFiles method has an override that allows for recursive searching. I would try using that and see if your problem goes away...

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);
    }
}
David
I saw this option but it crashes if one dir goes wrong so its really not practical
Crash893
A: 

debugging problem.

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

What you are seeing is one of "Managed Debugging Assistants" (MDA) and can be disabled by Debug->Exceptions ... > Expand the MDA node and uncheck the box against contextswitchdeadlock .

ralu
does that really fix the problem? or does debugging problem mean that its only a problem while i am debuging?
Crash893
Code loks like correct. Reference this tread http://groups.google.com/group/microsoft.public.vsnet.debugging/browse_thread/thread/1e4ac1010ae5920d/03ca1c82ea79287b?pli=1It is all about debugger problem trying to detect deadlocks in multitreaded system.
ralu