我有一个winform应用程序,在繁重的计算过程中会变得非常无响应。例如,当用户按下F10
键时,程序将启动一些繁重的东西并且暂时没有响应(我知道这不是一种理想的程序流方式,但我不想改变程序的工作方式目前)。
现在的问题是,在此期间,如果用户再次按下F10
,程序将在完成第一个过程后立即开始执行相同操作。
如何在某一点禁用捕获键并再次启用它?
答案 0 :(得分:2)
程序不是“捕获密钥”,它由操作系统排队,因为您的主UI-Thread忙于计算并且当时没有处理任何事情。我能想到的唯一一件事就是在你允许另一次运行之前检查在最后一次运行完成后经过了一定时间。我的拙见是一个丑陋的黑客。
但是,是的,这就是为什么你应该使用backgroundworkers或线程。使用BackgroundWorker要比开始时看起来容易得多。
答案 1 :(得分:0)
理想情况下,您应该使用BackgroundWorker
,但正如您所说
我不想改变程序目前的工作方式。)
所以我不会走那条路。
你可以做的是当你第一次检测到F-10时将bool值设置为true,下次每当你检测到f-10时,检查bool是否已经为真。如果已经存在,请不要再次启动繁重操作,只需跳过代码即可。
在繁重的处理结束时,将bool设置为false。
答案 2 :(得分:0)
我总体上同意杰森的观点 - 黑客和临时修复都有一种习惯成为程序的“特征”。
但是,为了回答您的问题,我建议您在程序中使用禁用标志,以便在计算运行时禁用所需的功能。然后,您可以在事件处理程序中检查标志:
public bool DisableFlag { get; set; }
public void MyKeyEventHandler(object sender, EventArgs e)
{
if (DisableFlag)
{
return;
}
// Do stuff
}
希望有所帮助!
干杯,
克里斯。
编辑:
考虑肯的评论,这是真的,事件将排队,只有一些事件正在流行才会有用。所以,另一个选择是通过执行
来完全禁用偶数处理程序myControl =- MyKeyEventHandler;
然后
myControl =+ MyKeyEventHandler;
计算结束时。这样,没有事件排队,你可以避免Ken !!
所描述的问题