2016-04-28 74 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]); 

謝謝大家的意見。