2010-09-07 12 views
17

मैं प्रोग्रामिंग रूप से सी # 4 में एसिंक्रोनस ऑपरेशंस को श्रृंखलाबद्ध करने का प्रयास कर रहा हूं, जैसे किसी दिए गए स्ट्रीम ऑब्जेक्ट को लिखना। मैंने मूल रूप से यह "मैन्युअल" किया, एक ऑपरेशन से अगले ऑपरेशन में कॉलबैक लगाया, लेकिन मैंने सोचा कि मैं समवर्ती व्हील की पुन: आविष्कार करने की परेशानी को बचाने के लिए .NET 4 कार्य समांतर लाइब्रेरी का प्रयास करूंगा।मैं .NET 4 में कार्य समानांतर लाइब्रेरी के साथ असीमित संचालन कैसे श्रृंखला करूं?

साथ, मैं इतना की तरह कार्य में मेरी async कॉल लपेट प्रारंभ करने के लिए:

public static Task CreateWriteTask(Stream stream, byte[] data) 
{ 
    return Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null); 
} 

निरंतरता तुल्यकालिक संचालन चेनिंग बहुत आसान है (यदि आप दुर्भाग्यपूर्ण विधि नाम बहाना होगा) बना दिया है:

public static Task ChainFlush(Stream stream, Task precedingTask) 
{ 
    return precedingTask.ContinueWith(x => stream.Flush()); 
} 

लेकिन Task.ContinueWith विधि का कोई संस्करण नहीं है जो TaskFactory.FromAsync जैसा ही एसिंक ऑपरेशन स्वीकार करता है।

तो, यह सोचते हैं कि मैं TPL, मैं इस विधि का सही क्रियान्वयन के लिए क्या देख रहा हूँ का उपयोग कर के साथ जारी रहती:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) 
{ 
    //? 
} 
+0

टास्क क्रिएशनऑप्शन। अटैचमेंट टॉपरेंट? –

उत्तर

12

मेरे सबसे अच्छा विचार अब तक नया लिखने कार्य के निर्माण श्रृंखला के लिए है , तो Task<Task>Task में वापस चालू करने के लिए खोलना विस्तार विधि का उपयोग करें:

public static Task ChainWrite(Stream stream, byte[] data, Task precedingTask) 
{ 
    return precedingTask.ContinueWith(x => CreateWriteTask(stream, data)).Unwrap(); 
} 
1

ContinueWhenAll() या ContinueWhenAny() बजाय ContinueWith() की कोशिश करो। here देखें।

+0

यहां एमएसडीएन लिंक है: - http://msdn.microsoft.com/en-us/library/dd997423.aspx – prashanth

+1

दिलचस्प संदर्भ, लेकिन वास्तव में मेरी समस्या का समाधान नहीं करता है। जारी रखें जब कोई भी Async Ops को स्वीकार करने के लिए ओवरलोड नहीं करता है, केवल क्रिया और Func । आपके लिंक में इटरेटर कार्यान्वयन एक दिलचस्प विचार है और मैं इसे किसी अन्य मुद्दे के लिए अनुकूलित कर सकता हूं, लेकिन यह मानता है कि मैं वही काम कर रहा हूं, और मूल रूप से ऐसा करने का एक पुनरावृत्ति तरीका है I 'मेरे मौजूदा उत्तर में उल्लेख किया गया है (किसी अन्य कार्य के अंदर एक कार्य बनाना)। फिर भी धन्यवाद! – FacticiusVir

3

जहां तक ​​मैं इसे समझता हूं, यह एक दुर्भाग्यपूर्ण परिणाम है जब कोई कार्य शुरू होने पर नियंत्रण में नहीं होता है। के बाद से आप जानते हैं कि जब किसी कार्य शुरू कर दिया जाता है कभी नहीं, वहाँ नहीं हो सकता

precedingTask.ContinueWith(Task nextTask) 

क्योंकि एक बार बनाया है, यह पहले से ही है जब आप 'ContinueWith' को पाने के लिए शुरू कर दिया जा सकता है की तरह एक अधिभार। इसके अलावा, यह प्रकार की गड़बड़ी भी करेगा। यहां टाइप होना चाहिए:

precedingTask<T>.ContinueWith(Task<..what?..> nextTask) 

पूर्व में एक टी रिटर्न देता है, तो अगला क्या लेता है और क्या देता है? :) हालांकि इसे बंद करने के साथ हल किया जा सकता है।

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