And*_*nda 1 multithreading timer .net-4.0 c#-4.0
我已经有一个运行System.Timers.Timer的Windows服务,它可以执行特定的工作.但是,我想要一些作品同时运行,但是在不同的线程中.
我被告知要创建一个不同的System.Timers.Timer实例.它是否正确?这种方式是否可以并行运行?
例如:
System.Timers.Timer tmr1 = new System.Timers.Timer();
tmr1.Elapsed += new ElapsedEventHandler(DoWork1);
tmr1.Interval = 5000;
System.Timers.Timer tmr2 = new System.Timers.Timer();
tmr2.Elapsed += new ElapsedEventHandler(DoWork2);
tmr2.Interval = 5000;
Run Code Online (Sandbox Code Playgroud)
请问tmr1并tmr2在不同的线程运行,以便DoWork1和DoWork2可同时运行,即同时?
谢谢!
这不是不正确的.
小心.System.Timers.Timer将为每个Elapsed事件启动一个新线程.当您的Elapsed事件处理程序耗时太长时,您会遇到麻烦.您的处理程序将在另一个线程上再次被调用,即使之前的调用尚未完成.这往往会产生难以诊断的错误.通过将AutoReset属性设置为false可以避免的事情.还要确保在事件处理程序中使用try/catch,吞没异常而不进行诊断.
多个计时器可能意味着多个线程.如果两个计时器滴答同时发生(即一个正在运行而另一个正在运行),那么这两个计时器回调将在不同的线程上执行,这两个线程都不是主线程.
但是,重要的是要注意,计时器本身根本不会在线程上"运行".涉及线程的唯一时间是计时器的滴答或已过去的事件触发.
另一方面,我强烈反对你不要使用System.Timers.Timer.计时器的已用事件会压缩异常,这意味着如果异常逃脱了您的事件处理程序,您将永远不会知道它.这是一个臭虫隐藏.你应该使用System.Threading.Timer.System.Timers.Timer只是一个包装器System.Threading.Timer,因此您可以获得相同的计时器功能,而不会隐藏错误.
请参阅Swallowing exception隐藏错误以获取更多信息.