F # nóng để dừng Async.Start
Xin chào, tôi có câu hỏi về không đồng bộ trong F #.
Vì vậy, tôi có một thủ tục đơn giản chạy trong backgrount được đặt trong một loại thành viên và nó trông giống như:
type Sender () =
member this.Start udpConectionPool =
async { (* ome operation that continusly send something to throu udp*) } |> Async.Start
Vì vậy, điều này bắt đầu và bắt đầu liên tục gửi các khung qua UDP mà không chặn phần còn lại của chương trình, nhưng thỉnh thoảng tôi muốn khởi động lại luồng (giả sử tôi muốn thêm điểm cuối mới, nó sẽ gửi nó đến đó là tham số udpConectionPool).
Tôi đã suy nghĩ về một cái gì đó như giao nhiệm vụ cho thành viên và sau đó:
member this.Stop = async { do! (*stop async start member that contains task*)}
Và sau đó tôi có thể khởi động lại tác vụ này với nhóm kết nối được cập nhật, nhưng tôi không biết liệu tôi có thể làm điều đó hay không. Câu hỏi của tôi là, Có thể dừng nhiệm vụ như vậy không, hoặc nếu không thì có cách nào tốt hơn để làm điều đó không?
Trả lời
Cách tiêu chuẩn để hủy bỏ quy trình làm việc không đồng bộ F # đang sử dụng a CancellationToken. Khi bạn gọi Async.Start, bạn có thể cung cấp mã thông báo hủy. Khi mã thông báo bị hủy, quy trình không đồng bộ hóa sẽ dừng (sau khi công việc chặn hiện tại kết thúc):
open System.Threading
let cts = new CancellationTokenSource()
let work = async { (* ... *) }
Async.Start(work, cts.Token)
cts.Cancel() // Sometime later from another thread
Để tích hợp điều này với Sender, bạn có thể lưu trữ hiện tại CancellationTokenSourcevà có một Stopphương thức hủy bỏ nó (nếu bạn muốn giữ nó bên trong một lớp trạng thái). Ngoài ra, bạn có thể quay lại IDisposabletừ Startphương thức theo cách tương tự như cách Observablegiao diện hoạt động:
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() }
Bằng cách này, người gọi Startcó trách nhiệm lưu trữ IDisposablevà xử lý nó trước khi gọi Startlại.