我有一个问题,我想要一些建议。我的GUI中有一个按钮,用于启动复杂的设置序列(连接到模拟数字转换器并开始记录来自回声测深仪的数据)。完成设置后,该按钮将从开始变为停止,并具有预期的行为。我所经历的是,在漫长的操作过程中,如果用户再次点击按钮(即使它被禁用),事件仍然会在重新启用后发送到按钮。我发现正确工作的唯一方法是在再次启用按钮之前调用Application.DoEvents()。我真正想要做的就是吞下发往我按钮的事件,所以DoEvents()看起来有点沉重。由于人们似乎一致反对调用DoEvents(),我希望这里的聪明人能够帮助我提出一种替代解决方案。注意我没有尝试过我的演示代码,但它紧随我真实的代码,除了真正的长方法。发送给禁用控件的事件
- 有没有其他的方法可以做到这一点?
它是安全的(ISH)来调用从后台工作的完成部分的DoEvents()?
公共Form1类:表格{
BackgroundWorker worker; Button startButton; bool state; public Form1() { state = false; BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler(StartSequence); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ToggleButton); startButton = new Button(); startButton.Text = "START"; startButton.Click += new System.EventHandler(StartClicked); this.Controls.Add(startButton); } private void StartClicked(object sender, EventArgs e) { startButton.Enabled = false; worker.RunWorkerAsync(!state); } private void StartSequence(object sender, DoWorkEventArgs e) { bool onState = (bool) e.Argument; if (onState) { RunReallyLongStartupSequence(); } else { RunReallyLongStopSequence(); } state = onState; } private void ToggleButton(object sender, RunWorkerCompletedEventArgs e) { startButton.Text = state ? "STOP" : "START"; // THIS IS WHAT I AM WORRIED ABOUT! Application.DoEvents(); startButton.Enabled = true; }
}