将SetTimer()和KillTimer()移植到C#?

时间:2011-04-21 21:22:26

标签: c# c++ winapi timer

我正在尝试将一些代码从C ++移植到C#。

我在C ++代码中遇到过这个问题:

watchdogTimer = SetTimer(1,1000,NULL);
...
KillTimer(watchdogTimer);

这段代码在做什么,以及如何将其移植到C#?

感谢。

2 个答案:

答案 0 :(得分:1)

假设您的应用程序是在MFC下编写的,SetTimer()方法属于CWnd类,负责设置Windows计时器。有关此文档,请访问http://msdn.microsoft.com/en-us/library/49313fdf(v=vs.80).aspx。我对.NET知之甚少,但快速谷歌搜索找到了以下内容:http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx

答案 1 :(得分:1)

您正在查看的CWnd::SetTimer函数会创建一个计时器,将WM_TIMER个事件发送到窗口。这类似于.NET中的System.Windows.Forms.Timer组件。它的行为与System.Timers.Timer略有不同。有两个特别相关的差异:

Windows.Forms.Timer在UI线程上调用事件处理程序。默认情况下,System.Timers.Timer在线程池线程上调用事件处理程序。您可以使用SynchronizingObject属性在UI线程上进行System.Timers.Timer调用。

另一个区别是,Windows窗体计时器不可能遇到重入问题,因为Windows不允许来自队列中同一计时器的多个WM_TIMER消息,也不会放置WM_TIMER队列中的消息(如果已经处理了一个消息)。这通常是件好事。

另一方面,

System.Timers.Timer将允许重入。因此,如果您的计时器事件处理程序花费的时间超过计时器周期,您可以同时处理同一计时器的多个事件。如果您的计时器周期为100毫秒且处理时间为150毫秒,那么当您处理第一个计时器时,您将收到另一个通知。如果你使用SynchronizingObject来强制UI线程上的回调,这可能会导致一大堆待处理的回调被排队。

两个计时器的实现完全不同。 Windows窗体计时器使用已存在20年的旧样式Windows timers。这种类型的计时器需要窗口句柄和消息循环,因此仅在GUI程序中使用。 System.Timers.TimerSystem.Threading.Timer周围的精简包装,它使用Windows Thread Pool Timers