2010-11-02 26 views
7

यह सवाल मैं पूरी तरह से समझ में नहीं आताएजेंट/MailboxProcessor सी # में नए async का उपयोग कर/इंतजार

एफ # में async के बारे में paper को पढ़ते हुए दो विषयों को जोड़ती है, मैं एजेंटों/MailboxProcessors, के विषय में आए जो प्रतिक्रियाशील राज्य मशीनों को लागू करने के लिए इस्तेमाल किया जा सकता है। सी # 5 में नई एसिंक/प्रतीक्षा कार्यक्षमता सी # में समान कुछ लागू करने के लिए उपयोग की जा सकती है, या क्या पहले से ही कुछ एनालॉग है जो बेहतर अनुकूल होगा?

+0

क्या आप टूटी हुई लिंक को ठीक कर सकते हैं? – czifro

+0

@czifro, ठीक है। – Benjol

उत्तर

3

सिद्धांत रूप में, मुझे उम्मीद है कि इन एफ # एपीआई को सी # -प्लस-एसिंक-प्रतीक्षा में अनुवाद करना सीधा होगा।

प्रैक्टिस में, मैं अस्पष्ट हूं कि अगर यह सुंदर, या बदसूरत और अतिरिक्त प्रकार की टिप्पणियों से भरा हुआ है, या बस गैर-मूर्खतापूर्ण और कुछ एपीआई-मालिश की आवश्यकता है तो इसे सी # में घर पर और अधिक महसूस करने के लिए। मुझे लगता है कि जूरी तब तक बाहर है जब तक कोई काम नहीं करता और कोशिश करता है। (मुझे लगता है कि इंतजार सीटीपी में ऐसा कोई नमूना नहीं है।)

+2

सीटीपी डाउनलोड किया गया। अब मैं कोशिश करके अपनी अज्ञानता का विस्तार करने के लिए आगे बढ़ूंगा :) – Benjol

+0

मुझे लगता है कि आपका सुपर ब्रेकअवे इसे नमूनों में बधाई देता है, बधाई :) – Benjol

+1

ओच! मेरे लिए यह बहुत मुश्किल है :( – Benjol

11

कुछ भयानक भयानक हैकिंग के साथ, आप का उपयोग कर 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 विधि का उपयोग करके)।

+0

ओच, मेरी आंखें :) 'कार्य -> ​​Async ' ठीक उसी तरह था जो मैं फंस गया था, इसलिए मैं इसे देख लूंगा।सी # में मेलबॉक्स प्रोसेसर को फिर से लिखने के बारे में, या फिर रिकर्सन के बारे में आपके दूसरे बुलेट बिंदु के कारण यह प्रयास के लायक नहीं होगा? – Benjol

+0

@ बेंजोल - मैंने सी # में एक समान प्रकार लिखा था। यह कोड की लगभग 300 लाइनें थीं। एक सरलीकृत एपीआई अंतर है। – ChaosPandion

+0

@ बेंजोल: मुझे लगता है कि सी # में मेलबॉक्सप्रोसेसर को फिर से लिखना एक विकल्प भी होगा। लॉकिंग और सिंक्रनाइज़ेशन सही (विशेष रूप से 'TryScan' विधि के लिए) प्राप्त करना आसान नहीं है, लेकिन मुझे लगता है कि इसे काम करना चाहिए (आप हमेशा रिकर्सन से बच सकते हैं, लेकिन _state मशीनों के मामले में कोड काफी खराब दिखता है, इसलिए यह दुर्भाग्यपूर्ण है उपयोगकर्ताओं को यह लिखना है) –

0

आप Stact पर एक नज़र डाल सकते हैं। इसे थोड़ी देर में अपडेट नहीं किया गया है, लेकिन यदि आप थोड़ा बेहतर सी # समर्थन के साथ कुछ बनाना चाहते हैं, तो आपको यह एक अच्छा प्रारंभिक बिंदु मिल सकता है। मुझे नहीं लगता कि यह एसिंक/प्रतीक्षा के साथ अद्यतित है, हालांकि।

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

  • कोई संबंधित समस्या नहीं^_^