public void Scan() { this.scannersNotComplete = (UInt16)(maxPort - minPort + 1); this.scannersDoneWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset); for (UInt16 port = minPort; port <= maxPort; port++) { if (port <= 0) { break; // use this if maxPort == 65535 } Boolean threadsNotAvailable = !threadTracker.Available; if (threadsNotAvailable) { Console.WriteLine("Reached maximum threads ({0}) at port {1}", maxThreads, port); if (sleepTime > 0) { Console.WriteLine("Sleeping for {0} milliseconds...", sleepTime); Thread.Sleep((Int32)sleepTime); } } threadTracker.Reserve(); if (threadsNotAvailable) { Console.WriteLine("Continuing Thread Creation", port); } new Thread(new PortConnectionThread(this, port).Run).Start(); } Console.WriteLine("Waiting for remaining threads to finish..."); this.scannersDoneWaitHandle.WaitOne(); }