Как остановить фонового работника - PullRequest
1 голос
/ 21 марта 2012

Почти весь пример backgroundworker состоит из цикла for. Но мое требование не нуждается ни в какой петле. У меня есть следующий код работает в фоновом режиме. Как отменить рабочий процесс без использования цикла for

 void form_DoWork(LoadingProgress sender, DoWorkEventArgs e)
    {

            //for (int i = 0; i < 100; i++)
        //{


        //    System.Threading.Thread.Sleep(50);
        //    sender.SetProgress(i, "Step " + i.ToString() + " / 100...");
        //    if (sender.CancellationPending)
        //    {
        //        e.Cancel = true;
        //        return;
        //    }
        //}
              // heavy database process       
             SomeClass.BulkInsert(ExportLine);
        }  


   private void ButtonCancelClick(object sender, EventArgs e)
    {
        //notify the background worker we want to cancel
        worker.CancelAsync();
      //disable the cancel button and change the status text
        buttonCancel.Enabled = false;
        labelStatus.Text = CancellingText;
    }  

1 Ответ

2 голосов
/ 21 марта 2012

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

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

РЕДАКТИРОВАТЬ:

Вот примитивный пример того, как она может работать.(примечание: это может не скомпилироваться, я не записал это в IDE).

Thread _dbThread;

void DoLongRunningQueryAsync()
    {
        bool dbWorkFinished = false;
        _dbThread = new Thread(() =>
        {
             // heavy database process       
             SomeClass.BulkInsert(ExportLine);
             dbWorkFinished = true;
        });
        Thread monitorThread = new Thread(() =>
        {
             Thread.Sleep(5000);
             if (!dbWorkFinished)
             {
                 //Db work took too long. Abort
                 _dbThread.Abort();
                 this.Invoke(() => MessageBox.Show("Db work took too long. Query aborted"); );
             }
        });
        _dbThread.Start();
        monitorThread.Start();
     }  


   private void ButtonCancelClick(object sender, EventArgs e)
    {
        _dbThread.Abort()
    }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...