C # Windows Forms - окно сообщения, показывающее еще раз каждый раз, когда я запускаю свой код - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение Windows Forms, которое тестирует алгоритмы сортировки. Оно состоит из одной формы. По завершении тестирования форма отображает окно с сообщением о том, что тестирование завершено. Но после первого теста оно отображается один раз, после второго - дваждыпосле 3-го раза три и так далее.Метод, который отображает 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 должен появляться только один раз в конце каждого теста, но количество раз, которое он появляется, увеличивается с каждымпробный запуск.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Проблема в том, что каждый раз, когда вы запускаете фоновый рабочий, вы добавляете дополнительные новые обработчики для этих двух событий. В первый раз у вас есть один обработчик для каждого. В следующий раз вы добавите еще один, так что у вас есть два. Оба называются. В следующий раз вы добавите еще один, и все три будут вызваны.

Что вы хотите сделать, это убедиться, что это происходит только один раз.

Мне нравится ваша идея поместить инициализацию обработчика событий в собственный метод, поэтому мы будем придерживаться этого.

//  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();
}
0 голосов
/ 11 июня 2019

Как и предполагалось, подключайте только эти события один раз . Здесь это делается из события 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();        
    }
...