gpt4 book ai didi

c# - 为什么 Timer_Tick 事件中的 SendKeys.SendWait 和 Thread.Sleep 没有阻塞?

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:21 25 4
gpt4 key购买 nike

我的表单上有一个 Timer 控件,带有以下 Tick 事件处理程序:

private void timer1_Tick(object sender, EventArgs e) {
foreach (char c in "Andrew") {
SendKeys.SendWait(c.ToString());
System.Threading.Thread.Sleep(1000);
}
}

System.Windows.Forms.Timer runs on the UI thread 以来,我希望事件处理程序在其运行时阻止进一步发生的 Tick 事件,这将提供 AndrewAndrewAndrew... 作为输出。相反,我得到 AnAnAnAn...

为什么后续的 Tick 事件会在第一个事件完成之前引发和处理?

如何确保计时器一次引发一个事件,并在处理程序运行完成之前完全阻塞?

我意识到 Thread.Sleep 是一种糟糕的计时代码方式。我只想知道发生了什么。

最佳答案

您是通过消息循环重新进入的受害者。您正在通过消息循环间接地递归到您的 timer1_Tick 函数中。正在发生的事情是在 SendKeys.SendWait 另一个 消息循环中(不是在不同的线程上)正在启动以监视消息是否已被处理。然后在另一个线程上,当在此内部循环中处理消息时,计时器正在触发并发布一条消息以再次调用您的 tick 函数。随之而来的是欢闹。

也许一个简化的例子会有所帮助。运行它并观察输出。

public class Program
{
private static Queue<Action> queue = new Queue<Action>();

public static void Main(string[] args)
{
// put three things in the queue.
// In a simple world, they would finish in order.
queue.Enqueue(() => DoWork(1));
queue.Enqueue(() => DoComplicatedWork(2));
queue.Enqueue(() => DoWork(3));

PumpMessages();
}

private static void PumpMessages()
{
while (queue.Count > 0)
{
Action action = queue.Dequeue();
action();
}
}

private static void DoWork(int i)
{
Console.WriteLine("Doing work: {0}", i);
}

private static void DoComplicatedWork(int i)
{
Console.WriteLine("Before doing complicated work: {0}", i);
PumpMessages();
Console.WriteLine("After doing complicated work: {0}", i);
}

}`

您有点假设,因为在 UI 中只有一个线程泵送消息,所以排队的每个项目都按顺序处理。但是,当放入队列的方法本身可以发送消息时,情况就不是这样了。在示例中,第三个操作实际上在第二个操作之前完成。 DoComplicatedWork 方法类似于 SendWait 中发生的事情。

我应该回答你关于如何防止这种情况的第二个问题。 lock 无济于事,因为它们是可重入的(即同一个线程可以多次获取锁)。最好的方法是在方法内部禁用计时器或分离滴答处理程序,然后在返回之前再次重新启用/附加处理程序。您也可以尝试使用一个简单的 boolean 标志来指示您是否已经在该方法中,如果是则返回。

关于c# - 为什么 Timer_Tick 事件中的 SendKeys.SendWait 和 Thread.Sleep 没有阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291704/

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