F # hot to stop Async.Start
안녕하세요, F #의 비동기에 대한 질문이 있습니다.
따라서 유형의 멤버에 배치되는 backgrount에서 실행되는 간단한 절차가 있으며 다음과 같습니다.
type Sender () =
member this.Start udpConectionPool =
async { (* ome operation that continusly send something to throu udp*) } |> Async.Start
그래서 이것은 프로그램의 나머지를 차단하지 않고 UDP를 통해 프레임을 계속 전송하기 시작하지만 때때로 스레드를 다시 시작하고 싶습니다 (새 엔드 포인트를 추가하고 싶다고 말하면 udpConectionPool 매개 변수입니다).
나는 일을 회원에게 덤핑하는 것과 같은 것을 생각하고 있었다.
member this.Stop = async { do! (*stop async start member that contains task*)}
그런 다음 업데이트 된 연결 풀을 사용하여이 작업을 다시 시작할 수 있지만 할 수 있는지 모르겠습니다. 제 질문은 그러한 작업을 중지 할 수 있습니까, 아니면 더 나은 방법이 있습니까?
답변
F # 비동기 워크 플로를 취소하는 표준 방법은 CancellationToken. 을 호출 할 때 Async.Start취소 토큰을 제공 할 수 있습니다. 토큰이 취소되면 비동기 워크 플로가 중지됩니다 (현재 차단 작업이 완료된 후).
open System.Threading
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
cts.Cancel() // Sometime later from another thread
이것을와 통합하려면 Sender현재를 저장하고 이를 취소 CancellationTokenSource하는 Stop메서드를 가질 수 있습니다 (상태 저장 클래스 내부에 유지하려는 경우). 양자 택일로, 당신은 반환 할 수 IDisposable로부터 Start방법과 유사한 방법으로 방법 Observable인터페이스 작업 :
type Sender () =
member this.Start udpConectionPool =
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
{ new System.IDisposable with
member x.Dispose() = cts.Cancel() }
이렇게하면의 호출자 Start는 반환 된 데이터를 저장하고 다시 IDisposable호출하기 전에 처리 할 책임이 Start있습니다.