2016-04-28 75 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

你永远不会开始任务[1]'因此当然不会完成任务。其次,即使你开始执行任务[1],如果它在'tasks [0]'开始的时候被标记为'IsCompleted',它几乎必须立即完成。 – 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(tasks [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]); 

谢谢大家的意见。