Функции после того, как фоновые работники выполняют до выполнения задач - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в форме Windows в Visual Studio 2017. Я пытаюсь создать простое приложение, которое начинает отсчитывать от 1 до 100 при нажатии на кнопку, а затем создает всплывающее окно после завершения процесса.Моя функция нажатия кнопки выглядит следующим образом:

private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        worker1.RunWorkerAsync(value);
        Open_Prompt(); //pop-up window
    }

Однако я понял, что функция Open_prompt выполняется до завершения предыдущей функции.Как мне изменить код так, чтобы всплывающее окно появилось только после того, как подсчет завершен?Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Я бы использовал обработчик завершенных событий.Он будет ждать, пока вызывающий абонент не завершит.

 private void button1_Click(object sender, EventArgs e)
        {
            worker1.RunWorkerCompleted += eventHandler;
            worker1.RunWorkerAsync(1);


        }

        private void eventHandler(object sender, RunWorkerCompletedEventArgs e)
        {
            MethodInvoker methodInvokerDelegate = delegate ()
            {
                Open_Prompt();
            };

            if (this.InvokeRequired)
                this.Invoke(methodInvokerDelegate);
            else
                methodInvokerDelegate();
        }
0 голосов
/ 27 ноября 2018

Вы можете попробовать использовать асинхронный метод

using System.Threading.Tasks;

private async void button1_Click(object sender, EventArgs e)
{
     button1.Enabled = false;
     await DoWorkAsync(e);
     MessageBox.Show("Done!");
     button1.Enabled = true;
}

private async Task DoWorkAsync(object value)
{
    await Task.Run(() =>
    {
       //Some work
    });
}

Однако вы можете сделать это с фоновым рабочим, как показано ниже:

using System.ComponentModel;

private BackgroundWorker _worker;

    public Form1()
    {
        InitializeComponent();
        _worker = new BackgroundWorker();
        _worker.DoWork += (sender, args) =>
        {
            //i do something
        };
        _worker.RunWorkerCompleted += (sender, args) =>
        {
            MessageBox.Show("Done!");
            button1.Enabled = true;
        };

    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        _worker.RunWorkerAsync(e);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...