正确的方式有无尽的等待

时间:2009-06-22 20:26:58

标签: c# .net

所以我有一个有定时器列表的程序。每个计时器都有一个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循环,那么程序就完成了。

4 个答案:

答案 0 :(得分:8)

使用EventWaitHandleEventWaitHandle数组来阻止线程执行,方法是使用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