2014-02-11 12 views
0

在控制台应用程序中,我们该如何做一个System.Timers.Timer在主线程中调用Elapsed事件的“简单”问题?c# - System.Timers.Timer主线程上已经发生的事件

我读过一些关于SyncronizingObject属性的内容,但是目前我还没有尝试实现一个实现ISyncronizeInvoke接口的类。

编辑(澄清):

我试图模拟一个典型的事件模型。我有一些代码使用基于事件的方法监视某些设备的状态。问题是一些设备不使用事件发送状态,并要求应用程序轮询数据。

找到的解决方案是使用计时器并轮询设备。如果发现任何变化,那么我们会提出类似的现有事件。

问题是遗留代码远离线程安全,并且适应它将是一个不小的任务。

也许有更好的方法。

+1

为什么需要在主线程上执行?是否只是希望主线程等待,直到事件发生后? – Sacrilege

+0

你的主线程在做什么?WinFoems,WPF或可能是服务的一部分? –

+0

它是服务的一部分。 – TiagoOliveira

回答

3

您的主线程需要首先具有某种类型的消息循环,并将消息发送到该消息循环的机制。如果你使用的是桌面UI环境,例如winforms,WPF等,这将会为你创建,但由于你不是,你需要自己创建一个。

消息循环,在它的最灵长类动物的水平,看起来是这样的:

while(!ShouldApplicationExit()) 
{ 
    var nextMesage = someQueueOfMessages.Dequeue(); 
    nextMessage(); 
} 

那么你当然需要公开某种方式为人们的信息添加到队列中,表明潜在的一些方法应用程序应该在某个时候退出。如果没有物品,您的队列也应该阻止,而不是崩溃和燃烧。

如果你愿意,你可以自己做所有这些。除非它特别花哨,否则不是那么耗时。

其他选择是使用其他的东西来创建消息循环,如Application.Run,这将在内部有一个循环,看起来有点不像我所展示的,在引擎盖下。

一旦你创建或决定了你的消息泵的实现,你就可以得到一些向泵添加新消息的机制。这就是你需要在你的ISyncronizeInvoke执行内部做的事情,呼吁那个机制。

+0

我设法以不同的方式解决问题,但由于这是解决问题的最接近的解决方案,因此我会将此答案标记为已接受。 – TiagoOliveira

0

System.Timers.Timer可用于触发事件,如果您很高兴在系统池的线程上引发事件。

如果你需要有更多的控制控制台应用程序定时回调,您可以CreateThread自己额外的线程,有这个WaitForSingleObject和有事件中断前台任务在运行时。

请参阅.Net Timeouts: WaitForSingleObject vs Timer进行类似的讨论。