程序无响应时禁用捕获密钥

本文关键字:密钥 响应 程序 | 更新日期: 2023-09-27 18:21:40

我有一个winform应用程序,在繁重的计算过程中可能会变得非常无响应。例如,当用户按下F10键时,程序将启动一些沉重的东西,并在一段时间内保持无响应(我知道这不是程序流的理想方式,但我现在不想改变程序的工作方式)。

现在的问题是,在此期间,如果用户再次按下F10,程序将在完成第一个过程后立即开始执行相同的操作。

如何在某个点禁用捕获密钥并再次启用?

程序无响应时禁用捕获密钥

该程序不是"捕获密钥",而是由操作系统排队,因为您的主UI线程忙于计算,并且当时不处理任何事情。我能想到的唯一一件事是,在允许再次跑步之前,检查上一次跑步结束后是否已经过了一定时间。在我看来,这是一个丑陋的黑客。

但是,是的,这就是为什么你应该使用后台工作者或线程。使用BackgroundWorker比一开始看起来要容易得多。

理想情况下,您应该在此处使用BackgroundWorker,但正如您所说的

我现在不想改变程序的工作方式)。

所以我不会走那条路。

你可以做的是,当你第一次检测到F-10时,将bool值设置为true,下次当你检测到F-10时,检查bool是否已经为true。如果它已经是真的,不要再次启动繁重的操作,只需跳过代码。

在重处理结束时,再次将bool设置为false。

总的来说,我同意Jason的观点——黑客和临时修复程序有成为程序"功能"的坏习惯。

然而,为了回答你的问题,我建议在你的程序中设置一个禁用标志,在你的计算运行时禁用所需的功能。然后,您可以在事件处理程序中检查标志:

public bool DisableFlag { get; set; }
public void MyKeyEventHandler(object sender, EventArgs e)
{
    if (DisableFlag)
    {
        return;
    }
    // Do stuff
}

希望能有所帮助
干杯,
克里斯。

编辑:

想想Ken的评论,这是真的,活动将被排队,只有在一些事件发生时才会有用。因此,另一种选择是通过执行来完全禁用偶数处理程序

myControl =- MyKeyEventHandler;

然后

myControl =+ MyKeyEventHandler;

当计算完成时。通过这种方式,没有事件排队,您可以避免Ken所描述的问题!!