首页 > 解决方案 > 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 应该只在每次测试结束时出现一次,但它出现的次数会随着每次测试的运行而增加。

标签: c#messagemessageboxbox

解决方案


如建议的那样,只需将这些事件连接一次。这里它是从 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();        
    }

推荐阅读