2016-05-20 3 views
0

Я знаю, что этот вопрос опубликовал несколько раз, но эта ситуация другая. Поэтому я предполагаю, что я выполняю метод, который необходимо перебирать через несколько элементов (строки базы данных), для этого требуется много времени.
Теперь в моем BackgroundWorker Мне нужно в каком-то случае остановить синхронизацию, в частности, когда пользователь нажмет кнопку. То, что я сделал в _DoWork случае это:Не удается остановить BackgroundWorker

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    while (!worker.CancellationPending) 
    { 
     LongOperation(); 
    } 
} 

теперь проблема, что когда я называю worker.CancelAsync()LongOperation() продолжить выполнение, но не должны! потому что while имеют состояние CancellationPending. Я видел в сети, что это решение thread-safe, так что, может быть, я что-то делаю неправильно?

+0

Что вы имеете в виду? Ожидаете ли вы, что LongOperation() будет прерван в _middle_ его выполнения? –

+0

@AdrianoRepetti Точно, мне нужно остановить его посредине выполнения. – IlDrugo

+0

Вам нужно будет войти в LongOperation и выйти из любых циклов, которые у вас есть. – LarsTech

ответ

4

Все, что вам нужно, это следующая структура

private void runButton_Click(object sender, EventArgs e) 
{ 
    worker=new BackgroundWorker(); 

    worker.WorkerSupportsCancellation=true; 
    worker.RunWorkerCompleted+=Bk_RunWorkerCompleted; 
    worker.DoWork+=Bk_DoWork; 
    worker.RunWorkerAsync(); 
} 

private void cancelButton_Click(object sender, EventArgs e) 
{ 
    worker.CancelAsync(); 
} 

void ReallyReallyLongOperation(BackgroundWorker worker) 
{ 
    ...within a loop 
    if(worker.CancellationPending) 
    { 
     return; 
    } 
} 

private void Bk_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ReallyReallyLongOperation(worker); 
    if(worker.CancellationPending) 
    { 
     e.Cancel = true; 
    } 
} 

private void Bk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if(!e.Cancelled) 
    { 
     ... 
    } 
} 
1

LongOperation() продолжить выполнение, но не должны! потому что while имеют состояние CancellationPending.

Нет, он должен продолжить выполнение! Вы совершенно ошибаетесь в понимании проверки while. Он не проверяет каждую секунду для отмены, он проверяет только до начала LongOperation!

Так что единственное, что можно сделать в такой ситуации, чтобы проверить worker.CancellationPending свойство внутри метод LongOperation, а не за его пределами.

Смежные вопросы