private void SendNextInternal() { try { PackageQueue.RemoveAt(0); WritePackageQueue(); } finally // preventing an exception not signaling the WaitHandle { InternalWaitHandle.Set(); // open the door (signals the wait handle) } SendFirstInternal(); }