let test =
Async.FromContinuations(
fun (cont,econt,ccont) ->
let rec inner() =
async {
do printfn "looping..."
do! Async.Sleep 1000
return! inner()
}
Async.Start(inner())
cont())
은 가정하자 나는 때문에, 이것은 자연적으로 내부 루프 정지를하지 않습니다 그래서
let cts = new CancellationTokenSource()
Async.Start(test, cts.Token)
cts.Cancel()
같은 계산을 시도 할 다음과 같은 정의를 고려 적절한 해약 토큰을 통과하지 못했습니다. Async.FromContinuations를 통해 외부 취소 토큰을 얻을 수있는 방법이 있습니까? 비동기 빌더와 Async.CancellationToken을 사용하여이 코드를 다시 작성할 수 있지만, 내부 표현식에 연속성을 전달할 수있는 기능이 손실됩니다.
CTS를 폐기하는 것을 잊지 마세요. 비동기의 use 절 아래에 밀어 넣어 두는 것이 좋습니다. – t0yv0
@toyvo 동의 - 누락 된 'Dispose'가 잘못되었습니다. 그러나 CTS가 발신자 (누가 그것을 만든 사람)에 의해 처리되어서는 안됩니까? 아마도'cts.Cancel()'호출 이후인가? (나는 비동기 내부에서'Dispose '를 호출하는 것이 잘못 될 수 있다고 생각할 것이다.) –
@TomasPetricek 네, 맞습니다. 비동기 완료시 CTS를 해제하려는 경우를 생각했지만 Dispose 후 Cancel이 호출되지 않도록해야합니다. 그것은 더 많은 코드가 필요합니다. – t0yv0