C # Background Worker Question - PullRequest
       2

C # Background Worker Question

8 голосов
/ 07 июня 2011

У меня есть фоновый рабочий, который в основном выполняет следующие действия:

  1. Найти следующий доступный файл и пометить его как обрабатываемый
  2. Обработать файл и сохранить обновленную версию как новуюfile
  3. Пометить оригинал как обработанный

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

Я хочу использовать Background Workerчтобы быть в состоянии быть остановленным, и я вижу параметр WorkerSupportsCancellation, но как я могу гарантировать, что он может останавливаться только между файлами, а не во время обработки файла?

Ответы [ 2 ]

9 голосов
/ 07 июня 2011

Установите для WorkerSupportsCancellation значение true и периодически проверяйте свойство CancellationPending в обработчике событий DoWork.

Метод CancelAsync устанавливает только свойство CancellationPending. Это не убивает нить; работник должен ответить на запрос отмены.

например:.

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    while( !myBackgroundWorker.CancellationPending )
    {
        // Process another file
    }
}
5 голосов
/ 07 июня 2011

Вы должны проверить CancellationPending процедур фонового работника в конце обработки файла

    static void Main(string[] args)
            {
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.WorkerSupportsCancellation = true;
                bw.RunWorkerAsync();
                Thread.Sleep(5000);
                bw.CancelAsync();
                Console.ReadLine();
            }

            static void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                string[] files = new string[] {"", "" };
                foreach (string file in files)
                { 
                    if(((BackgroundWorker)sender).CancellationPending)
                    {
                        e.Cancel = true;
                        //set this code at the end of file processing
                        return;
                    }
                }
            }
...