Как отменить фоновый рабочий со сном? - PullRequest
1 голос
/ 14 октября 2011

У меня возникают проблемы при отмене фонового работника, в котором есть Thread.Sleep(100).

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
        int count;
        try
        {
            count = int.Parse(textBox3.Text);

            for (int i = 0; i < count; i++)
            {
                backgroundWorker1.ReportProgress((int)(((double)(i + 1) / count) * 1000));
                //Computation code
                Thread.Sleep(int.Parse(textBox4.Text));
            }
        }
        catch (Exception ex)
        {
            request.DownloadData(url);
            MessageBox.Show(ex.Message);
        }
}

private void cancel_Click(object sender, EventArgs e)
{
    backgroundWorker1.CancelAsync();
    progressBar1.Value = 0;
}

Если я удаляю Thread.Sleep(100), то отмена работает, но в противном случае она просто продолжается (прогрессполоса не останавливается).

РЕДАКТИРОВАТЬ: Добавлен остаток кода

Ответы [ 2 ]

6 голосов
/ 14 октября 2011

Когда вы вызываете CancelAsync, он просто устанавливает свойство с именем CancellationPending в true. Теперь ваш фоновый работник может и должен периодически проверять, является ли этот флаг истинным, чтобы корректно завершить свою работу. Таким образом, вам нужно разбить фоновое задание на части, где вы можете проверить на отмену.

private void DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        while(true)
        {
            if(worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            Thread.Sleep(100);
        }
    }
0 голосов
/ 14 октября 2011

Используйте Thread.Interrupt для выхода из состояния WaitSleepJoin, когда вы хотите отменить фоновый поток.

http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx

...