Страницы

понедельник, 27 июня 2016 г.

C# Thread

https://msdn.microsoft.com/ru-ru/library/ts553s52(v=vs.110).aspx

https://msdn.microsoft.com/ru-ru/library/1h2f2459.aspx

BackgroundWorker позволяет вызывать некоторую операцию в отдельном потоке.

Объявляем сам объект и инициализируем его свойства:

backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_RunWorkerСompleted);
backgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker_ProgressChanged;

DoWork - это что у нас будет делать фоновый поток, для примера просто будем вызывать Sleep у текущего (фонового) потока

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
       for (int i = 1; i <= 100; i++)
       {
            if (backgroundWorker.CancellationPending)
                return;
            Thread.Sleep(1000);
            backgroundWorker.ReportProgress(i);
       }
}



Хочу обратить внимание, на то что я в цикле так же проверяю "backgroundWorker.CancellationPending" - это необходимо для того если этому процессу сказано остановиться. Далее в каждом цикле я вызываю метод у этого самого backgroundWorker под названием ReportProgress, которому я передаю процент выполняения потока (так же можно передавать и любой другой объект - к примеру, для отображения progressBar в своем диапазоне от 1 до 10000, для этого можно передать второй параметр).

Следующее, если хотим следить за тем что у нас происходит с потоком (прослеживать тот же процент выполнения), то для этого мы прикрепили метод к событию ProgressChanged:

void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
        progressBar.Value = e.ProgressPercentage;
}

В котором мы просто выставляем значение прогресс бару процента выполнения потока.

Ну а по окончании потока цепляем метод на событие RunWorkerCompleted, который, к примеру, просто сообщит что-то прекрасное:

void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
       MessageBox.Show(this, "Hello word!!!");
}

Раз упоминул про то, что поток можно остановить, ведь не просто так мы проверяли backgroundWorker.CancellationPending, то покажу как в нашем случае это делается, навесим на обычную кнопку метод на событие OnClick:

private void buttonCancel_Click(object sender, EventArgs e)
{
       backgroundWorker.CancelAsync();
}

Ну а для того, чтобы запустить поток необходимо просто вызвать метод:

backgroundWorker.RunWorkerAsyn​c();


Этот пример намного проще описанного в MSDN. Там есть пример с показом того, как можно передавать некоторые результаты между всеми методами, участниками фонового потока,

Комментариев нет:

Отправить комментарий

ваше мнение...