F # गर्म Async.Start को रोकने के लिए

Sep 04 2020

नमस्ते मैं एफ # में async के बारे में एक सवाल है।

इसलिए मेरे पास एक सरल प्रक्रिया है जो एक प्रकार के सदस्य में रखे गए बैकग्राउंट में चलती है और ऐसा दिखता है:

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*)}

और फिर मैं अपडेट किए गए कनेक्शन पूल के साथ इस कार्य को पुनरारंभ कर सकता हूं, लेकिन मुझे नहीं पता कि क्या मैं ऐसा कर सकता हूं। मेरा प्रश्न यह है कि क्या इस तरह के कार्य को रोकना संभव है, या यदि ऐसा करने का कोई बेहतर तरीका नहीं है?

जवाब

4 TomasPetricek Sep 04 2020 at 20:56

F # async वर्कफ़्लो को रद्द करने का मानक तरीका a का उपयोग कर रहा है CancellationToken। जब आप कॉल करते हैं Async.Start, तो आप एक रद्द टोकन प्रदान कर सकते हैं। जब टोकन रद्द हो जाता है, तो async वर्कफ़्लो बंद हो जाएगा (वर्तमान ब्लॉकिंग कार्य समाप्त होने के बाद):

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।