我有一個問題,我想要一些建議。我的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; }
}