Как остановить фонового работника при выходе из окна сообщения? - PullRequest
0 голосов
/ 16 октября 2019

Я разрабатываю форму в C #. Я использую backgroundworker для выполнения моих операций в форме, которую я разработал. и messagebox.show () выводится в конце транзакции;И я должен перейти к следующему шагу. Но backgorundworker продолжает работать, несмотря на окно сообщения. Фоновому работнику, вероятно, нужно заполнить метод RunWorkerCompleted. но, как видно из окна сообщения, я не знаю, как остановить его работу. Можешь мне помочь? Я думаю;

if(MessageBox.Show("convert is okey")
{
    ....//but ı dont know what am ı writing here, too?
}

Фоновый рабочий это:

private void Button7_Click(object sender, EventArgs e) 
{ 
   backgroundWorker1.RunWorkerAsync();      
   backgroundWorker1.WorkerReportsProgress = true; 
}

private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
        Convert(); backgroundWorker1.ReportProgress(i); 
    } 
    // Bitrate(); 
} // is do work

private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
}

private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    progressBar1.Value = 0; 
}

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

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

https://www.wpf -tutorial.com / misc / cancelling-the-backgroundworker /

0 голосов
/ 16 октября 2019

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

public class YourClass
{
   public static bool IsBackgroundProcessActive = true;
}

Теперь, когда вы работаете с окном сообщений, измените эту переменную.

if(MessageBox.Show("convert is okey")
{
    yourClass.IsBackgroundProcessActive  = false;
}

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

private void YourBackgroundWorkerFunction()
{
    while(yourClass.IsBackgroundProcessActive)
    {
       // Your simple iterative task 
    }
}

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

private void MarkAsSafeToStop()
{
    if(!yourClass.IsBackgroundProcessActive)
    {
        throw new OperationCancelledException();
    }
}

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

т.е.

private void YourBackgroundWorkerFunction()
{
   // Some code
   MarkAsSafeToStop();
   // Some other code
   MarkAsSafeToStop();
   // and so on.
}
...