मैं एफ # में एसिंक वर्कफ़्लो को समझने की कोशिश कर रहा हूं लेकिन मुझे एक हिस्सा मिला है कि मैं वास्तव में समझ में नहीं आता हूं और उम्मीद करता हूं कि कोई मेरी मदद कर सकता है।मुझे एक Async <T> को अन्य async वर्कफ़्लो में क्यों लपेटना है और चलो! यह?
निम्नलिखित कोड ठीक काम करता है:
let asynWorkflow = async{
let! result = Stream.TryOpenAsync(partition) |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
मैं एक async कार्यप्रवाह जहां TryOpenAsync एक टास्क प्रकार रिटर्न परिभाषित करते हैं। मैं इसे Async.AwaitTask के साथ Async में रूपांतरित करता हूं। (साइड क्वेस्ट: "प्रतीक्षा करें" कार्य? यह इंतजार नहीं कर रहा है बस इसे परिवर्तित करें, है ना? मुझे लगता है कि इसका कार्य टास्क के साथ कुछ नहीं है। प्रतीक्षा करें या प्रतीक्षा करें कीवर्ड)। मैं इसे "प्रतीक्षा" करने के साथ! और इसे वापस करो। वर्कफ़्लो प्रारंभ करने के लिए मैं RunSynchronously का उपयोग करता हूं जो वर्कफ़्लो प्रारंभ करना चाहिए और परिणाम को वापस करना (इसे बांधना)। नतीजतन मैं जांचता हूं कि स्ट्रीम पाया गया है या नहीं।
लेकिन अब मेरे पहले प्रश्न पर। मुझे TryOpenAsync कॉल को अन्य async गणना में क्यों लपेटना है और चलो! ("इंतजार") यह? ईजी। निम्नलिखित कोड काम नहीं करता:
let asynWorkflow = Stream.TryOpenAsync(partition) |> Async.AwaitTask
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
मैंने सोचा था कि AwaitTask यह बनाता है एक Async और RunSynchronously यह शुरू कर देना चाहिए। फिर परिणाम का प्रयोग करें। मुझे क्या याद आती है?
मेरा दूसरा सवाल यह है कि कोई भी "Async.Let!" क्यों है समारोह उपलब्ध है? शायद क्योंकि यह काम नहीं करता है या बेहतर नहीं है, यह निम्नलिखित कोड के साथ क्यों काम नहीं करता है?
let ``let!`` task = async{
let! result = task |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously (``let!`` (Stream.TryOpenAsync(partition)) )
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
मैं बस कोशिश करता हूं TryOpenAsync पैरामीटर के रूप में लेकिन यह काम नहीं करता है। कहकर काम नहीं करता मेरा मतलब है कि पूरा एफएसआई लटका होगा। तो यह मेरे async/"प्रतीक्षा" के साथ कुछ करने के लिए है।
--- अद्यतन:
>
Real: 00:00:00.051, CPU: 00:00:00.031, GC gen0: 0, gen1: 0, gen2: 0
val asynWorkflow : Async<StreamOpenResult>
val stream : Stream
FSI में कोड काम नहीं कर के परिणाम::
>
और तुम FSI में कुछ भी अमल नहीं कर सकते
FSI में कोड काम करने का परिणाम अब
--- अपडेट 2
मैं स्ट्रीमस्टोन का उपयोग कर रहा हूं। यहाँ सी # उदाहरण: https://github.com/yevhen/Streamstone/blob/master/Source/Example/Scenarios/S04_Write_to_stream.cs
और यहाँ Stream.TryOpenAsync: https://github.com/yevhen/Streamstone/blob/master/Source/Streamstone/Stream.Api.cs#L192
आपका कोड किस तरह से काम नहीं करता है? त्रुटि क्या है? आपको 'async' वर्कफ़्लो बनाने की आवश्यकता नहीं है। – Lee
जैसा कि मैंने अपने अंतिम वाक्य में उल्लेख किया है, मैं इसे एफएसआई के साथ शुरू करता हूं और यह चलता है और चलता है ("लटकता है")। एफएसआई पर कोई वापसी नहीं। मैं बस एफएसआई – KCT