所以我有一个有定时器列表的程序。每个计时器都有一个tick事件,我只想说,例如,我有10个计时器启动(所有计时器都在列表中)。
永远坐着的最佳方式是什么(或直到我告诉它停止)?我应该有一个while循环吗?
foreach(Timer t in _timers)
{
t.Start();
}
while(true)
{
Application.DoEvents();
System.Threading.Thread.Sleep(5000);
}
我觉得这不是最好的方式......
- 更新 这是我的整个计划:
public static void Main()
{
// set some properties and set up the timers
foreach(Timer t in _timers)
{
t.Start();
}
while(true)
{
Application.DoEvents();
System.Threading.Thread.Sleep(5000);
}
}
多数民众赞成。没有UI,没有别的。如果我没有while循环,那么程序就完成了。
答案 0 :(得分:8)
使用EventWaitHandle
或EventWaitHandle
数组来阻止线程执行,方法是使用WaitOne()
或WaitAll()
方法。
http://msdn.microsoft.com/en-us/library/kad9xah9.aspx
所以例如
ManualResetEvent mre = new ManualResetEvent(false);
mre.WaitOne();
将等待永恒。
修改强>
由于您正在提供服务,因此您可能需要阅读this article.
答案 1 :(得分:3)
通过Application.DoEvents
,我假设你在这里是一个UI线程。保持UI线程处于活动状态永远不是一个好主意(即使使用DoEvents
)。为什么不启动计时器并将控制权释放回消息泵。当事件发生时,它会选择事件。
你为什么要循环?
重新更新;您使用的是哪个Timer
?如果您使用System.Timers.Timer
(使用Elapsed
事件),那么它不会绑定到消息循环(它在单独的线程上触发):您可以挂起主线程,也许等待一些退出条件:
using System;
using System.Timers;
static class Program {
static void Main() {
using (Timer timer = new Timer()) {
timer.Interval = 2000;
timer.Elapsed += delegate {
Console.Error.WriteLine("tick");
};
timer.Start();
Console.WriteLine("Press [ret] to exit");
Console.ReadLine();
timer.Stop();
}
}
}
答案 2 :(得分:0)
您可以等待条件变量,或者在套接字上选择()。
答案 3 :(得分:0)
根据您退出程序的方式,您可能只考虑使用九个计时器,并将第十个活动作为代码主线程的一部分。
每个计时器都是一个单独的线程,应该小心处理。
DoEvents被认为是“邪恶的”,应该避免。 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx