我的应用程序包含生产者/消费者管道:
-> producer -> workers/producers -> worker -> (timer) ->
\<-----------------------------------------------------/
我需要每隔 30 秒重新启动整个工作。System.Timers.Timer
当管道底部的工作人员完成他的工作时,我正在使用一个计时器( ),计时器的委托向管道头部的等待生产者发出信号(我正在使用Monitor
等待/信号)。
这是有效的,但用户也应该能够停止整个过程并重新启动它。我的问题是我找不到一个体面的方法来处理以下情况:
系统正在等待计时器,同时用户按下停止按钮,然后按下重新启动按钮。要停止系统,我必须先将其唤醒(完成计时器将在 X 秒后完成的工作,不能等待)。各种线程优雅地死去,但计时器仍然活着。重新启动时,线程会复活并再次开始工作。如果计时器决定现在执行委托,那么这是一个问题。
我知道我可以做到timer.Stop()
,但在 MSDN 上它说:
事件处理方法可能在另一个线程调用 Stop 方法或将 Enabled 属性设置为 false 的同时在一个线程上运行。这可能会导致在计时器停止后引发 Elapsed 事件。
它还提供了一个解决问题的示例:http: //msdn.microsoft.com/en-us/library/system.timers.timer.stop.aspx但对我来说它看起来有点太低级和复杂并且涉及某种睡眠/重试循环让我觉得我试图以错误的方式实现我的目标。
有没有更好的方法来设计允许管道每 X 秒重新启动一次并且不会导致无法处理用户的停止/重新启动命令的整个事情?也许不使用计时器,我真的不知道......