簡體   English   中英

C#Windows窗體 - 每次運行代碼時,Messagebox再次顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM