我正在使用C#服务,它将通过WMI在网络上的各种服务器上加载信息。我已经设置它,以便每个服务器由我的ServerInfo类的实例表示。在主程序中,它初始化配置并循环通过服务器的ArrayList,使用ThreadPool.QueueUserWorkItem启动工作线程来初始化或更新每个服务器。
我想要做的是在配置中指定的时间过后,在后台刷新每个服务器。我的第一个想法是在每个服务器实例中设置一个System.Timers.Timer对象,一旦完成线程刷新方法,启动计时器。主程序将等待已发生的事件,并再次启动该服务器实例的刷新方法。
然而,看起来一旦工作线程完成,计时器就会死在水中并且永远不会发送一个已经过去的事件(看起来很明显,因为对象不再处理任何东西)。
我该怎么做才能触发这样的更新?
答案 0 :(得分:0)
好吧,我的第一个想法是让ServerInfo类在内部处理更新。 ServerInfo构造函数可以启动计时器或使用QueueUserWorkItem启动更新线程。这样,您就不必管理主程序中的所有更新逻辑。
ServerInfo类可能有一个主程序订阅的事件来接收更新。
没有必要将工作线程排队以启动计时器。只需在主线程(即ServerInfo的构造函数)中执行此操作
当然,我并不是100%清楚你想要完成什么,所以这可能不符合你的情况。
答案 1 :(得分:0)
System.Timers.Timer可能无法正常工作,因为它使用Windows消息,因此它需要一个消息泵,您的线程上没有。相反,请查看System.Threading.Timer。
但我的主要答案与Chris Hogan的相反。不要在对象内部进行线程化,而是在主应用程序代码中进行,或者至少是一层。
所以..你创建了所有的ServerInfo,这时只包含元数据,例如机器名。
然后使用System.Threading.Thread启动一个单独的线程,锁定ServerInfo的ArrayList,获取ArrayList的副本,然后遍历它并在每个ServerInfo上调用Update()方法。
您可以在每次更新后或在所有更新完成后触发事件。
不要忘记将来自ServerInfo.Updated的事件处理程序的调用封送到主线程!否则你将保持下一个更新周期。如果您要更改UI属性,则需要这样做。