2016-08-09 4 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) –

Смежные вопросы