मैं एफ # से सी # लाइब्रेरी का उपभोग करने में सक्षम होना चाहता हूं। ज्यादातर यह बहुत सीधा रहा है। हालांकि, अगर मैं एक ऐसे फ़ंक्शन को कॉल करने का प्रयास करता हूं जो Task<T> लौटाता है तो मैं लौटाया गया मान प्राप्त करने में सक्षम नहीं हूं।

तो, मेरे पास निम्नलिखित परिभाषा के साथ सी # विधि है:

public async Task<TEvent> ReadEventAsync<TEvent>(string streamName, int position) where TEvent: class

और मैं इस विधि को एफ # से उपभोग करने की कोशिश कर रहा हूं:

let readEventFromEventStore<'a when 'a : not struct> (eventStore:IEventStoreRepository) (streamName:string) (position:int) = 
     async {
            return eventStore.ReadEventAsync(streamName, position) 
            |> Async.AwaitTask
            }

मैं आंशिक रूप से इस फ़ंक्शन को IEventStoreRepository के उदाहरण के साथ लागू करता हूं और जिस स्ट्रीम नाम से मैं ईवेंट पुनर्प्राप्त करना चाहता हूं:

let readEvent = readEventFromEventStore eventStore streamName

फिर, अंत में, मैं शेष पैरामीटर लागू करता हूं:

let event = readEvent StreamPosition.Start

जब मुझे event का मान मिलता है तो यह Task<T> से T के बजाय एक FSharpAsync<object> होता है जिसकी मुझे उम्मीद थी।

C# में लिखी गई async विधि को Task<T> के रिटर्न प्रकार के साथ कॉल करने और T के मान तक पहुंचने के F# में सही तरीका क्या है?

21
David Brower 19 जिंदा 2017, 16:59
1
return eventStore. ... के बजाय return! eventStore. ... आज़माएं?
 – 
ildjarn
19 जिंदा 2017, 17:00
- बस वहीं कोशिश की। दुर्भाग्य से, यह ठीक वही परिणाम देता है यानी FSharpAsync<object>
 – 
David Brower
19 जिंदा 2017, 17:08

1 उत्तर

इस स्थिति के लिए async अभिकलन व्यंजक (F# कॉलिंग C# कार्य-आधारित XxxAsync विधि) का उपयोग करने का एक विकल्प task संगणना व्यंजक का उपयोग करना है:

https://github.com/rspeele/TaskBuilder.fs

जिराफ़ F# वेब फ्रेमवर्क कमोबेश इसी कारण से task का उपयोग करता है:

https://github.com/giraffe-fsharp/Giraffe/blob/develop/DOCUMENTATION.md#tasks

2
Andrew Webb 8 पद 2018, 12:24