Отмена потоков без сотрудничества, как правило, плохая практика, поэтому я бы не советовал делать это. См. Например эту статью . Это можно сделать, когда вы программируете непосредственно с Thread
(используя Thread.Abort ), но ни одна из современных параллельных / асинхронных библиотек для .NET (таких как TPL или F # Async) не использует это. Если это действительно то, что вам нужно, вам придется явно использовать потоки.
Лучшим вариантом является изменение функции work
, чтобы ее можно было совместно отменить. В F # это на самом деле означает просто обернуть его внутри async
и использовать let!
или do!
, потому что это автоматически добавляет поддержку отмены. Например:
let work (timeout:int) = async {
do! Async.Sleep(timeout)
return System.DateTime.Now.Ticks |> string }
Без использования async
(например, если функция написана на C #), вы можете передать значение CancellationToken
и использовать его, чтобы проверить, запрашивалась ли отмена (вызвав ThrowIfCancellationRequestsd
). Затем вы можете начать три вычисления, используя Async.Start
(создавая новый CancellationTokenSource
для каждого из вычислений).
Чтобы сделать что-то, пока все они не завершатся, я бы, вероятно, создал простой агент (который запускает какое-то событие, пока не получит заданное количество сообщений). Я не думаю, что есть более прямой способ сделать это (потому что Async.Parallel
использует один и тот же токен отмены для всех рабочих процессов).
Итак, я предполагаю, что смысл этого ответа - если work
должен быть отменен, то он должен знать о ситуации, чтобы он мог соответствующим образом с ней справиться.