程序无响应时禁用捕获密钥
本文关键字:密钥 响应 程序 | 更新日期: 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所描述的问题!!