取消异步并行代码

时间:2016-08-09 22:07:15

标签: c# async-await task-parallel-library

给出以下示例:

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;
    }

我的令牌取消了什么?是任务,并行执行还是两者兼而有之?我在哪里可以捕获哪个例外?

1 个答案:

答案 0 :(得分: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使用线程安全列表/集合

相关问题