在处置后监控多个Threading.Timers

我有一个进程,它创建一个动态的定时器列表(System.Threading.Timer)并继续运行,直到收到一个信号终止。 一旦收到信号终止,我希望任何现有的定时器回调完成(见下文):

private IList _timers = new List(); ... ... private void WaitOnExecutingThreads() { var waiters = new List(_timers.Count); foreach (var timer in _timers) { var onWait = new ManualResetEvent(false); waiters.Add(onWait); timer.Dispose(onWait); } WaitHandle.WaitAll(waiters.ToArray()); waiters.ForEach(x=> x.Dispose()); } 

此代码现在可以正常工作,但是我希望在处理定时器后监视正在进行的线程回调。 我的意图是以给定间隔写入日志“定时器A仍在运行”。

我开始玩:

 ThreadPool.RegisterWaitForSingleObject(....) 

add添加了以下内容:(注意:我创建了一个包含计时器和关联数据的ThreadContext类)

 private void WaitOnExecutingThreads() { var waiters = new List(); WaitOrTimerCallback IsRunning = (x, timeout) => { if (timeout) { Log(x + "is still running"); } }; foreach (var threadContext in _threadContexts) { var onWait = new ManualResetEvent(false); threadContext.Timer.Dispose(onWait); ThreadPool.RegisterWaitForSingleObject(onWait, IsRunning , threadContext.ThreadInfo.Id, new TimeSpan(0, 0, 30), false); waiters.Add(onWait); } WaitHandle.WaitAll(waiters.ToArray()); waiters.ForEach(x=> x.Dispose()); } 

我觉得这应该是C#.net 4.0中的一项直接任务。 在我的简单unit testing中,My IsRunning回调在等待之后发生了相当大的攻击。 此调用后我不再执行任何执行。 但我写了很多代码,我不太满意,觉得这会失败。

是否有更简单的解决方案或我误解了什么?

更新根据Peter R.的建议,我想出了以下内容。 授予它更多的代码行,但我没有注册单个线程对象。 如果处理后所有线程仍在执行,我会hibernate10秒并再次检查此示例。

  private void WaitOnExecutingThreads() { foreach (var threadContext in _threadContexts) { threadContext.DisposeWaiter = new ManualResetEvent(false); threadContext.Timer.Dispose(threadContext.DisposeWaiter); } while(_threadContexts.Count > 0) { for(var i = 0; i  0) { Thread.Sleep(new TimeSpan(0, 0, 10)); } } } .... public class ThreadContext { public string Name { get; set; } public Timer Timer { get; set; } public WaitHandle DisposeWaiter { get; set; } } 

_

如果处理程序尚未完成,则不会发出ManualResetEvents信号。 因此,您可以简单地测试事件是否处于信号状态。 即

 var isComplete = waiters[0].WaitOne(0);