2013-09-19 6 views
1

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

Существует пример кода и результата:

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     for (int i = 1; i <= 5; i++) 
     { 
      var cls = new CancellationTokenSource(); 

      Task task = Task.Factory.StartNew(state => 
      { 
       Console.WriteLine("Task Started"); 

       Timer timer = new Timer(TimeElapsed, cls, 3000, 0); 

       Thread.Sleep(6000); 

       Console.WriteLine("End Task"); 

      }, cls.Token); 

     } 

     Console.ReadLine(); 

    } 

    private static void TimeElapsed(object obj) 
    { 
     try 
     { 
      var cls = (CancellationTokenSource)obj; 
      cls.Cancel(); 
      cls.Token.ThrowIfCancellationRequested(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Aborted"); 
     } 
    } 
} 

enter image description here

+0

Уверены ли вы? Вы хотите убить нить зверски? 'Abort()' - это то, что вы ищете? –

ответ

0

Вы тестируете неправильный случай.

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

Вместо этого, если вы хотите нормальную отмену - это было бы так, если бы вы выполняли какую-либо работу через вызов порожденного потока/задачи/потока. Использование маркера отмены имеет смысл там - у вас есть длинная работа, которую вы хотите отменить.

+0

, если в параметре start timer 4 определить как 0 - он будет не периодическим и выполнить один раз. –

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