给出以下示例:
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 :(得分: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;
}
Task.Run( Action action, CancellationToken token )
如果在任务开始执行之前请求取消,则该任务不会执行。相反,它被设置为
Canceled
状态并抛出TaskCanceledException
例外。
OperationCanceledException
参数中的CancellationToken
被取消时抛出parallelOptions
PS 您应该为foundWords
使用线程安全列表/集合