2014-06-19 152 views
-2

您好我已經讀了很多的論壇,但我無法找到答案我的問題......我怎樣才能取消任務沒有LOOP

這裏是我的功能,我想取消時布爾變成真:

Task<PortalODataContext> task = Task.Factory.StartNew(() => 
     { 
      var context = connection.ConnectToPortal(); 
      connection.ListTemplateLib = this.ShellModel.ConnectionManager.GetTemplateLibrarys(connection); 
      connection.ListTemplateGrp = this.ShellModel.ConnectionManager.GetTemplateGroups(connection, connection.TemplateLibraryId); 
      connection.ListTemplates = this.ShellModel.ConnectionManager.GetTemplates(connection, connection.TemplateGroupId); 
      return context; 
     }, token); 

我該如何驗證令牌是否有沒有LOOP的取消請求?

類似的東西:

if (token.IsCancellationRequested) 
{ 
    Console.WriteLine("Cancelled before long running task started"); 
    return; 
} 

for (int i = 0; i <= 100; i++) 
{ 
    //My operation 

    if (token.IsCancellationRequested) 
    { 
     Console.WriteLine("Cancelled"); 
     break; 
    } 
} 

但是,我有一個需要循環,所以我不操作知道該怎麼做......

+2

爲什麼不添加循環,所以我們遵循你的思路。 –

+0

你走了;) – C1rdec

+0

每次粒狀操作後取消測試 – Jcl

回答

4

我假設tokenCancellationToken

你不需要循環,而是看看CancellationToken.ThrowIfCancellationRequested。通過調用它,CancellationToken類將檢查它是否已被取消,並通過拋出異常來終止任務。然後

你的任務代碼會變成這樣:

using System.Threading.Tasks; 
Task.Factory.StartNew(()=> 
{ 
    // Do some unit of Work 
    // ....... 

    // now check if the task has been cancelled. 
    token.ThrowIfCancellationRequested(); 

    // Do some more work 
    // ....... 

    // now check if the task has been cancelled. 
    token.ThrowIfCancellationRequested(); 
}, token); 

如果取消拋出異常,任務從Task.Factory.StartNew回來都會有IsCanceled屬性設置。如果你使用異步/等待,你需要趕上OperationCanceledException並適當地清理。

查看MSDN上的Task Cancellation頁面以獲取更多信息。

+0

所以我需要驗證令牌是否在每行之後取消? – C1rdec

+0

在取消每一個有意義的工作單元之後,是的。這可能是單個方法調用或一組方法調用。通過你發佈的例子,我會在每個ConnectionManager調用之前進行檢查。它並不總是每一行代碼。 –