private static void ProcessingThread(object objFileSystemObjectTaskWatcher)
        {
            FileSystemObjectTaskWatcher fileSystemObjectTaskWatcher = (FileSystemObjectTaskWatcher)objFileSystemObjectTaskWatcher;

            bool fileSystemObjectEventDetected = false;
            bool exitEvent = false;

            while ((!exitEvent) && (fileSystemObjectTaskWatcher.Running))
            {
                WaitHandle[] waitHandles = new WaitHandle[] { fileSystemObjectTaskWatcher._fileSystemObjectWatchEvent, fileSystemObjectTaskWatcher._exitEvent };

                int waitIndex = WaitHandle.WaitAny(waitHandles, fileSystemObjectTaskWatcher._eventResolutionMilliseconds);
                if (waitIndex != System.Threading.WaitHandle.WaitTimeout)
                {
                    // Not a timeout

                    switch (waitIndex)
                    {
                    case 0:     /* FileSystemObjectTaskWatcher._fileSystemObjectWatchEvent */
                        // File System Object Watcher Event occurred
                        Console.WriteLine("{0} : {1} : Detected a File System Object Event", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
                        fileSystemObjectEventDetected = true;
                        break;

                    case 1:     /* FileSystemObjectTaskWatcher._exitEvent */
                        Console.WriteLine("{0} : {1} : Detected an Exit Event", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
                        exitEvent = true;
                        break;

                    default:
                        Console.WriteLine("{0} : {1} : Detected an Unknown Event with WaitIndex {2}", DateTime.Now, Thread.CurrentThread.ManagedThreadId, waitIndex);
                        break;
                    }
                } // Not a timeout
                else
                {
                    // Timeout occurred

                    Console.WriteLine("{0} : {1} : Timeout after {2} ms waiting for File System Object Event",
                                      DateTime.Now,
                                      Thread.CurrentThread.ManagedThreadId,
                                      fileSystemObjectTaskWatcher._eventResolutionMilliseconds);
                    if (fileSystemObjectEventDetected)
                    {
                        // ProcessingThread this File System Object Event
                        fileSystemObjectEventDetected = false;
                        if (fileSystemObjectTaskWatcher._taskNameToExecute != null)
                        {
                            Console.WriteLine("{0} : {1} : Running task \"{2}\"",
                                              DateTime.Now, Thread.CurrentThread.ManagedThreadId, fileSystemObjectTaskWatcher._taskNameToExecute);
                            fileSystemObjectTaskWatcher.ExecuteTask();
                        }
                    } // ProcessingThread this File System Object Event
                }     // Timeout occurred
            }         // while

            Console.WriteLine("{0} : {1} : ProcessingThread exiting", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
        }