2015-10-10 3 views
1

Я только начал работать с задачами, и я пришел к некоторым вещам, которые я не совсем понимаю о вызовах методов в задаче. Я начал новую задачу так:Можно использовать маркер отмены при использовании метода задач внутри?

var ts = new CancellationTokenSource(); 
var token = ts.Token; 

Task.Run(() => Control(), token); 


void Control() 
{ 
    while(!token.IsCancellationRequested) 
    { 
      token.ThrowIfCancellationRequested(); 

      switch(ENUM) 
      { 

       case SOMETHING: 

       StartSomething(); 
       break; 

      } 


      Task.Delay(50, token).wait(); 
    } 
} 

Теперь я не понимаю поведение StartSomething() раз лексем была отменена. Что, если StartSomething() также содержит цикл while, могу ли я использовать его?

!token.IsCancellationRequested 

и

token.ThrowIfCancellationRequested(); 

Как хорошо, если исключение Аннулирование выбрасывают внутри этого StartSomething() цикла, он будет немедленно отменить задание?

+0

В идеале вы хотите передать «токен» на все, что может занять некоторое время, возможно, «StartSomething()» и периодически проверять токен для отмены. – MickyD

+0

Спасибо! Если задача будет отменена с помощью метода StartSomething(), это немедленно прекратит задачу или сначала вернется в цикл Control(), а затем сделает? – user2818626

+1

@ user2818626 он выдает исключение, которое будет пузыриться через 'Control'. Пока вы его не поймаете, задача будет отменена. – i3arnon

ответ

1

Да, вы можете легко передать тот же токен на StartSomething, и исключения из него будут пузыряться до Control и отменить задание. Если нет, то он будет продолжать работать, даже если CancellationToken was cancelled until it returns control to Control`, который наблюдает за фишку:

void StartSomething(CancellationToken token) 
{ 
    while (true) 
    { 
     token.ThrowIfCancellationRequested(); // Will cancel the task. 
     // ... 
    } 
} 

Имейте в виду, что хотя token.ThrowIfCancellationRequested() поднимет исключение и задание будет отменено в то время как !token.IsCancellationRequested просто завершить задание, не отмечая его как отмененное.

+0

Спасибо! Все это имеет смысл сейчас :) – user2818626

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