2012-10-03 12 views

उत्तर

27

वे अलग हैं। मुख्य अंतर यह है कि सी # मानक .NET Task<T> का उपयोग एसिंक्रोनस कंप्यूटेशंस का प्रतिनिधित्व करने के लिए करता है जबकि एफ # अपने स्वयं के प्रकार का उपयोग करता है जिसे Async<T> कहा जाता है।

अधिक विशेष रूप से, प्रमुख अंतर हैं:

  • एसी # async विधि एक Task<T> कि तुरंत शुरू किया जाता है (गर्म कार्य मॉडल), जबकि एफ # एक गणना आप स्पष्ट रूप से शुरू कर दिया है कि बनाता है बनाता है (जनरेटर मॉडल)। इसका मतलब है कि एफ # गणना रचना करना आसान है (आप उच्च स्तरीय abstractions लिख सकते हैं)।

  • एफ # में आप गणना भी शुरू करने के तरीके पर बेहतर नियंत्रण प्राप्त करते हैं। आप वर्तमान धागे पर इसे शुरू करने के लिए पृष्ठभूमि में का उपयोग करके गणना कर सकते हैं या Async.StartImmediate पर गणना कर सकते हैं।

  • एफ # अतुल्यकालिक वर्कफ़्लो स्वचालित रूप से समर्थन रद्द है, तो आप CancellationToken के आसपास पारित करने के लिए नहीं है।

  • शायद पहला बिंदु का एक और परिणाम यह है कि एफ # async workflows भी तो आप पुनरावर्ती workflows लिख सकते हैं पूंछ-प्रत्यावर्तन का समर्थन है, (यह सी # में आसानी से काम नहीं होगा, लेकिन सी # इस प्रोग्रामिंग शैली का उपयोग नहीं करता)

  • है

मैं इस विषय के बारे में विस्तृत लेख लिखा था: Asynchronous C# and F# (II.): How do they differ?

+1

धन्यवाद एक बहुत! लेकिन हुड के नीचे धागे कैसे उपयोग किए जाते हैं? डॉन सिमे ने अपनी पुस्तक 'एक्सपर्ट एफ #' में बताया कि एफ # थ्रेड होपिंग का उपयोग करता है। क्या यह सी # के लिए समान है या क्या कुछ मतभेद हैं? – Andries

+8

एफ # में, जब आप विशिष्ट 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' (यानी जीयूआई थ्रेड) के साथ थ्रेड पर प्रारंभ करते हैं तो एसिंक्रोनस गणना इस 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' पर वापस कूद जाती है। मुझे यह दस्तावेज नहीं मिला कि यह सी # में कैसे व्यवहार करता है, लेकिन मेरे प्रयोगों से पता चलता है कि यह वही व्यवहार करता है - यानी, यदि आप जीयूआई थ्रेड पर 'प्रतीक्षा' करना शुरू करते हैं, तो आपकी शेष गणना जीयूआई थ्रेड पर चली जाएगी (भले ही आप जिस कंप्यूटाइटन की प्रतीक्षा कर रहे हैं वह दूसरे थ्रेड पर निरंतरता चलाता है)। –

+1

@TomasPetricek एक बार फिर - एफ # के बारे में उत्कृष्ट जानकारी। –

संबंधित मुद्दे