2016-04-28 6 views
0

У меня проблема с отменой задачи в C#, задача [0] не прекращает выполнение. Вот код.Отмена задачи в C#

var tokenSource = new CancellationTokenSource(); 
var token = tokenSource.Token; 
Task[] tasks = new Task[2]; 
tasks[0] = Task.Run(() => { 
SomeClass Object1 = new SomeClass(); 
    if (tasks[1].IsCompleted) 
    { 
     tokenSource.Cancel(); 
    } 
},token); 
tasks[1] = Task.Run(() => 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
}); 
+0

Возможный дубликат [Как отменить задачу в ожидании?] (Http://stackoverflow.com/questions/10134310/how-to-cancel-a-task-in-await) – Claudius

+0

Стоит отметить, что мы не можете видеть, какой код выполняются другими задачами, и просто вызов 'CancellationTokenSource.Cancel()' фактически ничего не отменяет, на выполнение задачи лежит проверка маркера и действие по запросу аннулирования. – CodingGorilla

+0

Вы никогда не запускаете 'tasks [1]', поэтому, конечно, он не будет завершен. Во-вторых, даже если вы * сделаете * запустили 'задачи [1]', он должен был бы почти сразу завершить, если бы он был помечен как 'IsCompleted' к тому времени, когда запускаются задачи [0]'. – Rob

ответ

1

Во-первых, вы должны запустить tasks[1];

Во-вторых, вы должны проверить, если task[1] завершается в цикле и возвращения из задачи, вам не нужно CancellationToken в вашем примере:

Task[] tasks = new Task[2]; 

// run task[1] 

tasks[0] = Task.Run(() => { 
    SomeClass Object1 = new SomeClass(); 
    while (true) 
    { 
     if(tasks[1].IsCompleted) 
     { 
      return; 
     } 
    } 

},token); 
0

Я решил проблему, просто добавил «Task.WaitAll (задачи [1]); в конце кода.

  Task[] tasks = new Task[2]; 

     tasks[0] = Task.Run(() => 
     { 
     SomeClass Object1 = new SomeClass(); 
      if (tasks[1].IsCompleted) 
      { 
       tokenSource.Cancel(); 
      } 
     }); 
     tasks[1] = Task.Run(() => 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     }); 

     Task.WaitAll(tasks[1]); 

Спасибо всем за ввод.

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