在哪里可以找到演示轮询的优秀 C# 控制台应用程序?
Posted
技术标签:
【中文标题】在哪里可以找到演示轮询的优秀 C# 控制台应用程序?【英文标题】:Where can I find a good C# console app that demonstrates polling? 【发布时间】:2011-06-03 17:02:01 【问题描述】:我正在寻找一个用 C# 进行轮询的好例子。
基本上,每 X 秒读取一次仪器,并将值记录到文本文件中。我正在寻找一个使用 .NET 4 的并行库的示例。或者,也许我通过查看 TPL 来过度考虑这个解决方案......
ps- 这个问题与我之前关于数据库轮询的问题无关。
【问题讨论】:
【参考方案1】:我不确定我是否会特别在意 TPL。只需使用System.Threading.Timer
或System.Timers.Timer
定期执行操作。它们都将使用线程池 - 在此期间您打算在主控制台线程中做什么?
当然,另一个非常简单的选择是让主线程在轮询发生之间休眠。这很粗糙,但如果这是您的应用程序需要做的全部,那么它对您来说可能已经足够好了。我不确定如果系统时钟发生变化它会如何表现,请注意......这是用于生产使用的非常长时间运行的任务,还是只是一个快速工具? (如果它是一个长时间运行的应用程序,您可能需要考虑改用 Windows 服务。)
【讨论】:
这将用于长期运行的生产用途,我正在考虑使用 Windows 服务。我们现在正在制作原型,看看所有部分是如何组合在一起的。除非我们找到令人信服的理由将其保留为控制台应用程序,否则此组件可能最终会成为一项服务。 @SpecialAgent_W436:在那种情况下,我可能会选择其中一个计时器类。两者都非常易于使用。【参考方案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
。
【讨论】:
【参考方案3】:对我来说,使用 PL 来完成这项任务并不正确。我建议查看System.Timer,您可以使用它指定在应用程序中引发 Elapsed 事件的重复间隔,从而允许您处理事件以执行常规处理。
【讨论】:
以上是关于在哪里可以找到演示轮询的优秀 C# 控制台应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
Nginx学习系列之轮询的负载均衡及Ip_hash等常用指令介绍
Spring Web 应用程序中带有 Ajax 轮询的会话超时