Отменяет ли CancellationTokenSource внезапно? - PullRequest
0 голосов
/ 13 марта 2012

Допустим, у меня есть что-то вроде этого:

private CancellationTokenSource myToken;

public void MyMyMethod()
{
  myToken = new CancellationTokenSource();
  var task = Task.Factory.StartNew(() => DoIt(myToken.Token), myToken.Token);

  Thread.Sleep(100);
  myToken.Cancel();
}

public void MyOtherMethod()
{
  myToken.Cancel();
}

private void DoIt(CancellationToken token)
{
    token.ThrowIfCancellationRequested();
    try
    {
       for (int i = 0; i < 1000000; i++)
       {
         Console.WriteLine(i);
        }
    }
    catch (Exception ex)
    {
       string s = "";
    }
}

Если я вызову myToken.Cancel, он внезапно остановит задачу в методе DoIt или мне придется передать токен DoIt и вызвать myToken.ThrowIfCancellationRequested(), чтобы при вызове Cancel он вызывал исключение и внезапно останавливался ?

Могу ли я не сделать это, не передав токен методу задачи?

Или я должен отслеживать токен. Запрос об отмене запроса в методе DoIt?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Должен ли я передать токен DoIt и вызвать myToken.ThrowIfCancellationRequested ()

Да, вы делаете.Отмена TPL является кооперативной, что означает, что ваша функция потока должна периодически проверять, запрашивалась ли отмена, и, если это так, завершать себя.

Альтернативой было бы вызвать Thread.Abort(), что, как правило, не очень хорошая идея.

2 голосов
/ 13 марта 2012

При чтении отсюда http://social.msdn.microsoft.com/Forums/da-DK/parallelextensions/thread/9f88132a-f8bd-4885-ab63-645d7b6c2127 кажется, что токен используется для отмены задачи ДО того, как задача «действительно» запущена, но после того, как она была поставлена ​​в очередь.

Этобольше способ отменить задачу, которая запланирована, но еще не запущена.Как только задача запущена, единственный способ отменить ее - это совместная проверка в методе.Без этого вам придется всегда запускать задачу, а затем проверять ее внутри, что добавит много лишних, ненужных накладных расходов

Вы даже можете прочитать ее с Жетон отмены в Задачеконструктор: почему?

...