我正在寻找一个用C#进行轮询的好例子。
基本上,每隔X秒读取一次仪器并将值记录到文本文件中。我正在寻找一个使用.NET 4的并行库的示例。或者,也许我正在通过查看TPL来过度思考这个解决方案......
ps-这个问题与我之前关于数据库轮询的问题无关。
答案 0 :(得分:4)
我不确定我是否特别打扰TPL。只需使用System.Threading.Timer
或System.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事件的重复间隔,允许您处理事件以执行常规处理。