gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:45 25 4
gpt4 key购买 nike

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

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

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

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

谢谢。

最佳答案

您正在查看的 CWnd::SetTimer 函数创建了一个计时器,该计时器将 WM_TIMER 事件发送到窗口。这类似于 System.Windows.Forms.Timer .NET 中的组件。它的行为与 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 窗体计时器使用旧样式 Windows timers已经存在了 20 年。这种类型的定时器需要一个窗口句柄和一个消息循环,因此只在 GUI 程序中使用。 System.Timers.TimerSystem.Threading.Timer 的精简包装器,它使用 Windows Thread Pool Timers .

关于c# - 将 SetTimer() 和 KillTimer() 移植到 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com