कुछ भयानक भयानक हैकिंग के साथ, आप का उपयोग कर 0 #प्रकार सी # से टाइप कर सकते हैं। कुछ कठिनाइयों है कि प्रकार कुछ एफ # विशिष्ट सुविधाओं का उपयोग करता है (वैकल्पिक तर्क, विकल्प हैं कार्यों FSharpFunc
प्रकार, आदि हैं)
तकनीकी तौर पर, सबसे बड़ा अंतर यह है कि एफ # async जबकि सी # async एक काम है कि पहले से ही चल रहा है बनाता है dealyed है । इसका मतलब है कि सी # से F # async बनाने के लिए, आपको एक विधि लिखनी होगी जो unt -> Task<T>
लेती है और Async<T>
बनाता है। मैंने blog post that discusses the difference लिखा था।
static FSharpAsync<T> CreateAsync<T>(Func<Task<T>> f)
{
return FSharpAsync.FromContinuations<T>(
FuncConvert.ToFSharpFunc<
Tuple< FSharpFunc<T, Unit>,
FSharpFunc<Exception, Unit>,
FSharpFunc<OperationCanceledException, Unit> >>(conts => {
f().ContinueWith(task => {
try { conts.Item1.Invoke(task.Result); }
catch (Exception e) { conts.Item2.Invoke(e); }
});
}));
}
static void MailboxProcessor() {
var body = FuncConvert.ToFSharpFunc<
FSharpMailboxProcessor<int>,
FSharpAsync<Unit>>(mbox =>
CreateAsync<Unit>(async() => {
while (true) {
var msg = await FSharpAsync.StartAsTask
(mbox.Receive(FSharpOption<int>.None),
FSharpOption<TaskCreationOptions>.None,
FSharpOption<CancellationToken>.None);
Console.WriteLine(msg);
}
return null;
}));
var agent = FSharpMailboxProcessor<int>.Start(body,
FSharpOption<CancellationToken>.None);
agent.Post(1);
agent.Post(2);
agent.Post(3);
Console.ReadLine();
}
आप देख सकते हैं, इस लग रहा है वास्तव में भयानक :-):
Anwyay, अगर आप प्रयोग करना चाहते हैं, यहाँ कुछ कोड का उपयोग कर सकते है।
सिद्धांत रूप में, यह (सिर्फ इस कोड से बदसूरत बिट्स निकालने) MailboxProcessor
प्रकार के लिए एक सी # अनुकूल आवरण लिखने के लिए संभव हो सकता है, लेकिन कुछ समस्याएं हैं।
एफ # में आप अक्सर मेलबॉक्स प्रोसेसर में राज्य मशीन को लागू करने के लिए पूंछ-पुनरावर्ती एसिंक का उपयोग करते हैं। यदि आप सी # में एक ही चीज़ लिखते हैं, तो आपको अंततः StackOverflow
मिल जाएगा, इसलिए आपको म्यूटेबल स्टेटस के साथ लूप लिखना होगा।
एफ # में एजेंट लिखना और सी # से इसे कॉल करना पूरी तरह से संभव है। यह एफ # से सी #-फ्रेंडली इंटरफेस को उजागर करने का मामला है (Async.StartAsTask
विधि का उपयोग करके)।
स्रोत
2010-11-02 13:43:58
क्या आप टूटी हुई लिंक को ठीक कर सकते हैं? – czifro
@czifro, ठीक है। – Benjol