[英]C# Windows Forms - Messagebox showing once more every time I run my code
我有一個測試排序算法的Windows窗體應用程序。它由一個表單組成。當測試完成時,表單顯示一個消息框,表示測試完成。但是在第一次測試后它顯示一次,在第二次顯示后顯示兩次,之后第三次三次等等。 顯示MessageBox的方法由后台工作程序從“RunWorkerCompleted”方法調用。
private void RunAlgorithmTests()
//this is called from an onclick method
{
backgroundWorker.DoWork += (s, e) =>
{
test.RunTests();
};
backgroundWorker.RunWorkerCompleted += (s, e) =>
{
ShowCompleteMessage();
};
backgroundWorker.RunWorkerAsync();
}
private void ShowCompleteMessage()
//show this message on successful test complete
{
string title = "Test završen!";
string message = "Test završen nakon" + swatch.Elapsed.Hours.ToString() + ":" + swatch.Elapsed.Minutes.ToString() + ":" + swatch.Elapsed.Seconds.ToString();
this.Text = "Aplikacija za testiranje algoritama sortiranja";
if (test.complete)
{
MessageBox.Show(message, title);
}
}
MessageBox應該只在每次測試結束時出現一次,但每次測試運行時出現的增量次數。
如建議的那樣,只將這些事件連接一次 。 這是從Form的Load()事件完成的:
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker.DoWork += (s, e) =>
{
test.RunTests();
};
backgroundWorker.RunWorkerCompleted += (s, e) =>
{
ShowCompleteMessage();
};
}
private void button1_Click(object sender, EventArgs e)
{
RunAlgorithmTests();
}
//this is called from an onclick method
private void RunAlgorithmTests()
{
backgroundWorker.RunWorkerAsync();
}
問題是每次運行后台工作程序時,都會為這兩個事件添加其他新處理程序。 第一次,每個人都有一個處理程序。 下次再添加一個,所以你有兩個。 兩者都被稱為。 下一次,你添加另一個,所有三個都被調用。
你想要做的是確保只發生一次。
我喜歡你把事件處理程序初始化放在自己的方法中的想法,所以我們會堅持下去。
// Your Form class is probably called something else.
public Form1()
{
InitializeComponent();
// Since backgroundWorker was created in the form designer, it will have been
// initialized in InitializeComponent(). Therefore, this has to happen after
// InitializeComponent() is called.
InitializeBackgroundWorkerHandlers();
}
private void InitializeBackgroundWorkerHandlers()
{
backgroundWorker.DoWork += (s, e) =>
{
test.RunTests();
};
backgroundWorker.RunWorkerCompleted += (s, e) =>
{
ShowCompleteMessage();
};
}
// this is called from an onclick method
private void RunAlgorithmTests()
{
backgroundWorker.RunWorkerAsync();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.