Как сказал Брайан, сами рабочие места должны поддерживать отмену. Модель программирования для отмены, которая лучше всего работает с F #, основана на CancellationToken
, потому что F # автоматически сохраняет CancellationToken
в асинхронных рабочих процессах.
Для реализации отмены вашим JobA
методам потребуется дополнительный аргумент:
type A() =
member x.Foo(str, cancellationToken:CancellationToken) =
for i in 0 .. 10 do
cancellationToken.ThrowIfCancellationRequested()
someOtherWork()
Идея состоит в том, что вы часто звоните ThrowIfCancellationRequested
во время выполнения вашей работы. Если запрашивается отмена, метод теряет силу, и операция останавливается. После этого вы можете написать асинхронный рабочий процесс, который получает текущий CancellationToken
и передает его члену JobA
при вызове:
let task =
[ async { let! tok = Async.CancellationToken
return A.JobA("A", tok) };
async { let! tok = Async.CancellationToken
return B.JobB("B") }; ]
Теперь вы можете создать новый токен с помощью CancellationTokenSource
и запустить рабочий процесс. Когда вы затем отмените источник токена, он автоматически остановит все задания, выполняемые как часть рабочего процесса:
let src = new CancellationTokenSource()
Async.Start(task, cancellationToken = src.Token)
// To cancel the job:
src.Cancel()