Как заставить отменить задачу? - PullRequest
9 голосов
/ 14 марта 2011

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

Task someTask = new Task(() => {

  while(!IsCancellationRequested) {

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();

    Do_something_over_a_long_period_of_time();
    token.ThrowIfCancellationRequested();
  }
});
someTask.Start();

И есть довольно нетерпеливые пользователи. Они жаждут немедленно прекратить мою заявку. Они не хотят ждать, пока идет длинное действие.

Я использовал класс Thread и смог немедленно прервать все мои потоки, вызвав команду Abort().

Как мне немедленно прервать выполнение заданий?

Спасибо.

Ответы [ 2 ]

18 голосов
/ 14 марта 2011

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

Вы должны вместо этого сделать Do_something_over_a_long_period_of_time звонки отменяемыми (то есть передать им токен и заставить их регулярно проверять).

РЕДАКТИРОВАТЬ: Как отмечалось в другом ответе, вы можете убить приложение , просто убедившись, что все потоки переднего плана завершены. Но вы должны знать, что ваши задачи не обязательно будут иметь возможность завершить чисто . Если они делают что-то вроде записи файлов, вы можете подождать, пока отмена не будет замечена, чтобы не повредить сохраняемое состояние.

2 голосов
/ 14 марта 2011

Они хотят немедленно прекратить мою заявку.Они не хотят ждать, пока выполняется длинное действие.

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

Так что, пока вы хотите выйти из процесса, проблем не возникает.

Обратите внимание, что Thread.Abort () был быстрым, но небезопасным.Даже не для того, чтобы выйти из приложения, но тогда это вряд ли вызовет реальную проблему.

...