public PollManager() { SilentTimers = new List<SilentTimer>(); PollQueue = new Queue<PollItem>(); ResumePollEvent = new ManualResetEvent(false); PollThread = new Thread(delegate() { try { while (PollThread.IsAlive) { if (PollQueue.Count == 0 || SilentTimers.Count > 0) { if (lastBusyState == true && PollManagerChangeStateEvent != null) { PollManagerChangeStateEvent(false); } lastBusyState = false; ResumePollEvent.Reset(); ResumePollEvent.WaitOne(); } else { if (lastBusyState == false && PollManagerChangeStateEvent != null) { PollManagerChangeStateEvent(true); } lastBusyState = true; CurrentPollItem = PollQueue.Dequeue(); if (CurrentPollItem != null) { DonePollEvent = new ManualResetEvent(false); DonePollTimer = new System.Timers.Timer(90000); DonePollTimer.Elapsed += delegate(object s, ElapsedEventArgs ev) { DonePollTimer.Stop(); DonePollEvent.Set(); CurrentPollItem.Terminate(); }; DonePollTimer.Start(); CurrentPollItem.Action(delegate() { if (DonePollTimer != null) { DonePollTimer.Stop(); } if (DonePollEvent != null) { DonePollEvent.Set(); } }); DonePollEvent.WaitOne(); if (PollThread.ThreadState != ThreadState.AbortRequested && PollThread.ThreadState != ThreadState.Aborted && PollManagerUpdateUnitStateEvent != null) { PollManagerUpdateUnitStateEvent(CurrentPollItem.Unit); } } } } } catch (ThreadAbortException e) { } }); }