gpt4 book ai didi

c# - 处理后是否有可能获得 Timer.Tick 事件

转载 作者:行者123 更新时间:2023-11-30 14:08:56 24 4
gpt4 key购买 nike

我有一个关于 System.Windows.Forms.Timer 的问题。处理后是否有可能获得 Tick 事件?例如,如果消息在消息循环中,同时我处理了定时器。如果可能的话,最好的预防方法是什么。你现在有什么好的资源来解释它吗,因为我找不到任何解释它的东西。这是解释我的问题的相同代码:

namespace TestTimer
{
public partial class Form1 : Form
{
ObjectWithTimer obj = null;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if(obj != null)
{
obj.Deinit();
obj = null;
}
obj = new ObjectWithTimer();
}
}

public class ObjectWithTimer
{
public Object o = new object();
public Timer timer = new Timer();
bool disposed = false;

public ObjectWithTimer()
{
timer.Interval = 10;
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
}

public void Deinit()
{
timer.Enabled = false;
timer.Tick -= new EventHandler(timer_Tick);
timer.Dispose();
timer = null;
disposed = true;
}

private void timer_Tick(object sender, EventArgs e)
{
if (disposed)
{
//Is it possible to get here
if (timer.Enabled) return;
}
//doing something
}
}
}

最佳答案

了解计时器的工作原理可以帮助您感觉更好。它们由操作系统实现,启动计时器的底层 winapi 调用是 SetTimer() .每当计时器滴答作响时,操作系统都会发布通知,您会收到 WM_TIMER message。 . Winforms 中的管道确保您的 Tick 事件处理程序在收到此消息时运行。

这些消息存储在消息队列中,消息队列是与窗口关联的内部数据结构。此队列序列化消息,这是确保您永远不会丢失鼠标点击或键盘按键的基 native 制,即使窗口因 UI 线程忙于其他事情而无响应时也是如此。

这个队列给出了谨慎的理由,当你释放定时器时队列存储了一个 WM_TIMER 消息会发生什么?除非采取极端措施,否则您仍会收到该消息,并且您的 Tick 事件处理程序将触发。

不过不用担心,WM_TIMER 属于一小组以特殊方式生成的消息。它们是综合消息,只有当您的程序使用 GetMessage() 请求消息时才会生成。属于该组的其他常见消息是 WM_PAINT,它会触发 Paint 事件。请注意,您可以随心所欲地调用 Invalidate(),您仍然只会获得一个 Paint 事件。 WM_MOUSEMOVE 是另一个,它触发 MouseMove 事件。您可以推断出,无论您移动鼠标的速度有多快,都永远不会让鼠标移动消息淹没消息队列。

这些合成消息的另一个特征是它们似乎具有“低优先级”。鉴于它们仅在消息队列为空时才被合成。这就是键盘消息和鼠标点击总是在绘制之前生成事件的原因。

长话短说,如果您请求消息并且计时器仍然存在,您只能收到 WM_TIMER 消息。 Timer.Dispose() 方法在后台调用 KillTimer()。这结束了仍然获得 Tick 事件的任何机会。唯一可能搞砸的方法是从工作线程调用 Stop() 或 Dispose() 方法。不要那样做。

关于c# - 处理后是否有可能获得 Timer.Tick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32453041/

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