我正在尝试将一些代码从C ++移植到C#。
我在C ++代码中遇到过这个问题:
watchdogTimer = SetTimer(1,1000,NULL);
...
KillTimer(watchdogTimer);
这段代码在做什么,以及如何将其移植到C#?
感谢。
答案 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.Timer
是System.Threading.Timer
周围的精简包装,它使用Windows Thread Pool Timers。