c# - C# Windows 窗体 - 每次运行代码时都会再次显示消息框
问题描述
我有一个测试排序算法的 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();
}
推荐阅读
- laravel - Laravel Nova:将日期时间转换为可读输出
- hibernate - 使用 Hibernate + EhCache、EhCache 或 NoSql 的性能比较
- php - 发送基于搜索结果的基础时出错
- c - postgresql passwordcheck.c 修改
- testing - 如何为 Android Studio 创建小米模拟器?或者任何其他方式在小米模拟器上测试应用程序?
- robotframework - 如何在机器人框架中使用基于其他元素文本/存在的两个定位器之一
- c# - 当所有值都为空时,WPF隐藏DataGridTemplateColumn
- python - Python Flask - 如果文件扩展名是 xls,则不返回输出
- javascript - 如何在渲染内的反应js中传递数组
- ocaml - 在同一记录的其他字段中使用记录字段