2016-02-26 2 views
0

Что я пытаюсь достичь?ThrowIfCancellationRequested() vs Abort()

Я пытаюсь отменить длительную задачу из другой задачи с помощью CancellationToken. Для меня невозможно обработать отмену и выполнить долговременную задачу, потому что она никогда не коснется кода, который обрабатывает отмену (задача обрабатывает плохой шаблон регулярного выражения, который занимает вечность, в любом случае это не важно). Я попытался обработать из другой Задачи и опроса для запроса аннулирования, и когда я вызываю ThrowIfCancellationRequested(), он на самом деле бросает этот поток. Таким образом, долго работающая задача все еще жива и висит.

Как я решил эту

Ну вместо того, чтобы использовать ThrowIfCancellationRequested лексемы() я acually называется Abort() на тему давно работает задача, и он работает как шарм.

И мой вопрос: Я уверен, что это не очень элегантно, и я хотел бы знать, если это нормально, что я там делал и как еще я могу подойти к этой ситуации?

+1

http://stackoverflow.com/questions/4359910/is-it-possible-to-abort-a-task-like-aborting-a-thread-thread-abort-method –

+0

Спасибо, сэр. Итак, первые строки ... Это не в порядке! Это ужасно. –

+1

Thread.Abort не делает то, что вы думаете. [См. Мой ответ здесь] (http://stackoverflow.com/questions/27561976/check-if-thread-finished-its-method-before-killing-it-c-sharp) –

ответ

3

Thread.Abort is evil потому что это очень опасно. Отмена в .NET (и любая другая платформа, о которой я знаю) является совместной. Либо сделайте действие отменить себя по требованию, либо изолировать его, чтобы вы могли просто игнорировать его.