我正在使用WinForms应用程序,我有一个用户控件.用户控件中的按钮将事件提升到要由其他代码处理的表单.其中一个按钮启动一些过程,如果它们同时运行会导致问题.我在代码中有逻辑来管理状态,因此通常用户无法运行该进程(如果它已在运行).但是,如果用户双击该按钮,它将快速启动该过程两次,以至于我很难阻止它.
我想知道,处理这个问题的最佳方法是什么?
我开始时通过在单击事件中禁用按钮,但在第一次单击导致按钮被禁用之前,第二次单击进入.在代码中设置其他标志也没有捕获它.
我正在考虑在引发事件的代码上添加某种同步锁,但我想知道你是否有更好的想法.
由于这个项目大部分都是完整的,我正在寻找不涉及对应用程序进行彻底改写的答案(比如实现复合应用程序块),但是,我也可以自由发布这些想法,因为我可以在我的下一个项目中使用它们.
确保您的按钮禁用或您执行的任何其他锁定是您在事件处理程序中执行的/ first/thing.如果你甚至可以在第一条指令触发之前排队两次点击事件,我会感到非常惊讶,但我想如果你是在一台非常慢的计算机上,可能会被其他应用程序陷入困境.
在那种情况下,使用标志.
private bool runningExclusiveProcess = false; public void onClickHandler(object sender, EventArgs e) { if (!runningExclusiveProcess) { runningExclusiveProcess = true; myButton.Enabled = false; // Do super secret stuff here // If your task is synchronous, then undo your flag here: runningExclusiveProcess = false; myButton.Enabled = true; } } // Otherwise, if your task is asynchronous with a callback, then undo your flag here: public void taskCompletedCallback() { runningExclusiveProcess = false; myButton.Enabled = true; }
如果您仍然可以两次点击这样的东西,那么请确保您不会意外地订阅doubleClick事件,或者其他任何其他事情都会发生.