我在哪里可以找到一个演示轮询的好的C#控制台应用程序?

时间:2011-06-03 17:02:02

标签: c# .net-4.0 polling

我正在寻找一个用C#进行轮询的好例子。

基本上,每隔X秒读取一次仪器并将值记录到文本文件中。我正在寻找一个使用.NET 4的并行库的示例。或者,也许我正在通过查看TPL来过度思考这个解决方案......

ps-这个问题与我之前关于数据库轮询的问题无关。

3 个答案:

答案 0 :(得分:4)

我不确定我是否特别打扰TPL。只需使用System.Threading.TimerSystem.Timers.Timer定期执行操作即可。这些都将使用线程池 - 您在此期间在主控制台线程中计划做什么?

当然,另一个简单选项就是让主线程在轮询发生之间休眠。这很粗糙,但如果那个所有你的应用程序需要做,那对你来说可能已经足够了。如果系统时钟发生变化,我不确定它的行为方式,请注意......对于生产使用的长期任务,还是只是一个快速工具? (如果它是一个长期运行的应用程序,您可能需要考虑使用Windows服务。)

答案 1 :(得分:2)

创建计时器真的很容易:

static void Main(string[] args)
{
    // Create a timer that polls once every 5 seconds
    var timer = new System.Threading.Timer(TimerProc, null, 5000, 5000);
    Console.WriteLine("Polling every 5 seconds.");
    Console.WriteLine("Press Enter when done:");
    Console.ReadLine();
    timer.Dispose();
}

static int TickCount = 0;
static void TimerProc(object state)
{
    ++TickCount;
    Console.WriteLine("tick {0}", TickCount);
}

请注意,TimerProc在单独的线程上调用。你的主程序可以做其他的事情,这将继续每五秒轮询一次,直到你杀死(或修改)计时器。

我更喜欢System.Threading.Timer而不是System.Timers.Timer,因为后者会吞下例外。如果您的elapsed事件处理程序中存在抛出异常的错误,您将永远不会知道它,因为System.Timers.Timer事件处理程序将禁止该异常。出于这个原因,我强烈建议你不要使用它。请改用System.Threading.Timer

答案 2 :(得分:1)

对于此任务,使用PL对我来说听起来不正确。我建议您查看System.Timer,您可以使用该{{3}}指定在应用程序中引发Elapsed事件的重复间隔,允许您处理事件以执行常规处理。