2010-05-09 13 views
8

क्या कोई तरीका है कि मैं विस्तार विधि को अतुल्यकालिक बना सकता हूं?एक्सटेंशन विधि बनाना असीमित

मैंने थोड़ी देर के लिए चारों ओर देखा है, लेकिन अभी तक कुछ भी संबंधित नहीं मिला है। हालांकि देख रहेगा ...

+0

एसिंक्रोनस विधि के बारे में आपका क्या मतलब है? – Dewfy

उत्तर

10

एक विस्तार विधि बस, एक सामान्य स्थिर विधि है वाक्यात्मक चीनी यह आह्वान करने के लिए के साथ।

तो बाहर काम कैसे आप एक सामान्य विधि अतुल्यकालिक बनाने चाहते हैं (उदाहरण के लिए .NET 4 में यह के भीतर एक टास्क शुरू करने, द्वारा) और वहाँ से चले जाते हैं।

7

किसी विधि को एसिंक्रोनस विधि को कॉलबैक भेजने के लिए और विधि को एक नया धागा स्पिन करें।

मैं .net 3.5 में एक छोटा नमूना ऊपर मार पड़ी है (शायद जॉन हमें एक 4.0 नमूना दिखा देंगे):

public static void Extension<T>(this T self, AsyncCallback callback) 
    { 
     var state = new State { callback = callback }; 
     System.Threading.ThreadPool.QueueUserWorkItem(ExtensionCore, callback); 
    } 

    private static void ExtensionCore(object state) 
    { 
     // do stuff with OtherStuff 
     var complete = new Complete(); 
     ((State)state).callback(complete); 
    } 

    private class State 
    { 
     public AsyncCallback callback { get; set; } 
     public object OtherStuff { get; set; } 
    } 

    public class Complete : IAsyncResult 
    { 
     public object AsyncState 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public System.Threading.WaitHandle AsyncWaitHandle 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool CompletedSynchronously 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool IsCompleted 
     { 
      get { throw new NotImplementedException(); } 
     } 
    } 
} 
+0

हमारे उत्तर वाई के लिए धन्यवाद। :) –

2

एक स्पर्शिक रूप से संबंधित नोट पर, Reactive Extensions for .NET एक्सटेंशन विधियों प्रदान करता है जो एसिंक्रोनस प्रोग्रामिंग में सहायता करते हैं। .NET 4 में Task Parallel Library भी है (जो जॉन ने बताया है) जो संग्रह पर सामान्य संचालन के समानांतर करने में मदद कर सकता है और आम तौर पर अपवादों (कई कार्यों में अपवादों को एकत्रित करने) के प्रसार को सरल बनाता है, कई समानांतर कार्यों के बीच समन्वय जो उनके परिणामों को जोड़ना चाहिए, रद्दीकरण और अन्य परिष्कृत व्यवहार के लिए समर्थन।

4

मुझे लगता है कि वे इसे ठीक करने का प्रयास कर रहे हैं। वैसे भी काम करना आसान है, वैसे भी। यहां बताया गया है कि आप यह कर:

public static async Task DoAsynchronousWork(this string doWorkTo) 
{ 
    await AnotherAsyncFunctionAsync(doWorkTo); 
    await DoSomeOtherWorkAsync(doWorkTo); 
    await DoMoreWorkAsync(doWorkTo); 
} 

वी.एस. इस बारे में एक फिट फेंक नहीं होगा, यह संकलन होगा:

मान लीजिए कि async विधि आप एक एक्सटेंशन में बनाने की कोशिश कर रहे हैं इस तरह दिखता है कि चलो बस ठीक। हालांकि, अगर आप "MyString".DoAsynchronousWork() पर कॉल करने का प्रयास करते हैं, तो यह एक त्रुटि फेंक देगा, कह रहा है कि इसमें एक स्ट्रिंग पैरामीटर गुम है। तो यह इस तथ्य को पूरी तरह से अनदेखा नहीं करता है कि यह एक विस्तार है, लेकिन इसे अभी भी "यह" पैरामीटर की आवश्यकता है!

सौभाग्य से, यह इसके आसपास जाना आसान है। बस इस के साथ DoAsynchronousWork बदल देते हैं:

public static Task DoAsynchronousWork(this string doWorkTo) 
{ 
    return new Task(async() => { 
     await AnotherAsyncFunctionAsync(doWorkTo); 
     await DoSomeOtherWorkAsync(doWorkTo); 
     await DoMoreWorkAsync(doWorkTo); 
    }); 
} 

मुझे आशा है कि वे इस तय हो इससे पहले कि वे .NET 4.5 रिलीज, लेकिन यदि नहीं, तो कम से कम यह आसान के आसपास काम करने के लिए है। (मैंने पाया कि लैम्ब्डा दुर्घटना से असीमित हो सकता है, लेकिन अब यह बहुत आसान हो रहा है!)

+0

धन्यवाद, @ एक मूल्यवान उत्तर के लिए @ upyou00। मुझसे ऊपर हटाना :-) अन्य शोधकर्ताओं के लिए बस एक त्वरित अद्यतन; "वे" * इस त्रुटि को .NET 4.5 के लिए समय पर तय कर चुके हैं, उदाहरण के लिए [WindowsRuntimeStorageExtensions] (http://msdn.microsoft.com/en-us/library/hh582101.aspx) में एसिंक्रोनस एक्सटेंशन विधियों को देखें। कक्षा। –

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