2016-08-09 71 views
2

考慮下面的例子:取消異步並行代碼

private async Task<List<string>> SearchStrings(string text, ImmutableList<string> words, CancellationToken token) { 
     var foundWords = new List<string>(words.Count); 
     var result = await Task.Run(() => 
      Parallel.ForEach(words, (s) => { 
       if (s.ToLower().Contains(text)) { 
        foundWords.Add(s); 
       } 
      })); 
     return foundWords; 
    } 

我有什麼與我的令牌取消?這是任務,並行執行還是兩者兼而有之?我在哪裏必須捕捉哪個異常?

+0

你真的要支持此方法的取消嗎?如果是的話,那麼這個任務應該以該取消標記開始 – Rahul

+0

這只是一個例子。問題總的來說我必須取消。 – VSDekar

+0

編輯我的評論...再次檢查 – Rahul

回答

1

傳遞CancellationToken的任務循環,如下圖所示:

private async Task<List<string>> SearchStrings(string text, ImmutableList<string> words, CancellationToken token) { 
    var foundWords = new List<string>(words.Count); 
    var result = await Task.Run(() => 
     Parallel.ForEach(words, new ParallelOptions { CancellationToken = token, }, (s) => { 
      if (s.ToLower().Contains(text)) 
      { 
       foundWords.Add(s); 
      } 
     }), token); 
    return foundWords; 
} 

PS你應該使用一個線程安全列表/收集foundWords

+0

爲什麼我需要取消循環?僅僅取消任務是不夠的嗎? – VSDekar

+0

作爲參數傳遞給任務的令牌將僅** **在任務開始執行**之前取消任務**。一旦任務正在運行,您必須在您的代碼中處理取消操作,那就是循環; o) –