2013-10-22 13 views
5

क्या मेरे पास asinc/await का उपयोग कर केवल ऑनऑनट्रॉन कॉम्प्लेशन, केवल ऑन कंसेलड, नॉटऑनफॉल्ट, आदि जैसे सभी विकल्प हो सकते हैं? मैं टास्क का उपयोग के रूप में, उदाहरण के लिए एक ही परिणाम कैसे प्राप्त करने के लिए पर उदाहरण नहीं मिल सकता है:async/प्रतीक्षा का उपयोग कर कार्य कंटिन्यूशनऑप्शन सेट कैसे करें?

Task.Factory.StartNew(foo).ContinueWith(bar, TaskContinuationOptions.NotOnRanToCompletion); 

मुझे यकीन है कि नहीं कर रहा हूँ अगर सरल सशर्त या अपवाद हैंडलिंग सभी निरंतरता स्पष्ट कार्य में उपलब्ध व्यवहार प्रबंधन कर सकते हैं।

+0

क्या आप थोड़ा झंडे सेट कर सकते हैं? आपको इसका सक्षम होना चाहिए। टीबी, सुनिश्चित नहीं है कि आप क्या पूछ रहे हैं –

+2

अपवाद हैंडलिंग के लिए इसकी आवश्यकता नहीं है; बस 'try/catch' ब्लॉक का उपयोग करें और आप कोड लिख सकते हैं जैसे आप इसे लिखते हैं जैसे आप किसी भी कोड में वस्तुतः कहीं भी करेंगे। आप इसके बजाय उस शैली का उपयोग क्यों करना चाहते हैं? यदि आप "केवलऑन *" या "नोटऑन *" विकल्पों के अलावा कुछ और उपयोग करना चाहते हैं, तो आपको किसकी आवश्यकता है और क्यों? – Servy

+0

@natenho, अगर आपको वास्तव में इसकी आवश्यकता है, तो आप इस व्यवहार को एक [कस्टम प्रतीक्षाकर्ता] (http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115642.aspx के साथ लागू करने में सक्षम होना चाहिए)। – Noseratio

उत्तर

12

क्या मेरे पास केवल विकल्प हैं जैसे ONOnRanToCompletion, OnlyOnCanceled, NotOnFaulted, आदि async/await का उपयोग कर?

आपको इसकी आवश्यकता नहीं है। अगर सरल सशर्त या अपवाद हैंडलिंग सभी निरंतरता प्रबंधन कर सकते हैं

try 
{ 
    await foo(); 
} 
catch 
{ 
    bar(); 
    throw; 
} 

मैं सुनिश्चित नहीं हूं:

प्रचुर वाक्य रचना के बजाय

बिट झंडे और लैम्ब्डा निरंतरता का उपयोग कर, await एक बहुत ही स्वाभाविक try/catch वाक्य रचना का समर्थन करता है स्पष्ट कार्यों में उपलब्ध व्यवहार।

वे स्वाभाविक रूप से संभाल None, NotOnCanceled, NotOnFaulted, NotOnRanToCompletion, OnlyOnCanceled, OnlyOnFaulted, और OnlyOnRanToCompletion। अन्य झंडे केवल समानांतर कार्यों के लिए समझ में आता है, अतुल्यकालिक कार्य नहीं। उदा।, AttachedToParent, HideScheduler, और PreferFairnessasync दुनिया में समझ में नहीं आता है; DenyChildAttach, LazyCancellation, और ExecuteSynchronouslyहमेशाasync दुनिया में निर्दिष्ट किया जाना चाहिए; और LongRunningकभी होना चाहिए।

+0

सरल अपवाद हैंडलिंग नोटऑन * के लिए मेरा पहला दृष्टिकोण था और यह ठीक है पुष्टि करने के लिए अच्छा है।मुझे आपकी वाक्य के आखिरी हिस्से की समीक्षा करने के लिए अन्य झंडे पर नजदीकी नजर डालना होगा;) – natenho

+0

जब मैं एक ऐसी स्थिति में भाग गया जहां मुझे 'HideScheduler' ध्वज निर्दिष्ट करने की आवश्यकता है, तो मैं यहां आया था, और मैं नहीं कर सका । परिदृश्य: GUI थ्रेड से एक async विधि कहा जाता है, जिसे GUI थ्रेड एसिंक कॉल के अंत तक अवरुद्ध किया जाता है। इसका परिणाम डेडलॉक में होता है क्योंकि निरंतरता (प्रतीक्षा और अवरुद्ध) GUI थ्रेड पर पोस्ट की जाती है। HideScheduler दिन बचाएगा। कार्य-आसपास: 'नया कार्य ({async कॉल}, कार्यक्रियाशनऑप्शन। हाइडशेड्यूलर) .टार्ट() ' और इस अस्थायी कार्य की प्रतीक्षा करें। – robert4

+0

मुझे पता है कि आमतौर पर यह एक बीमार डिज़ाइन है जिसे जीयूआई थ्रेड को एसिंक कॉल के दौरान अवरुद्ध किया गया है, लेकिन यह एक विशेष कार्यक्रम था: मुख्य रूप से हेडलेस ऑपरेशंस (बैकअप कार्य की कल्पना करें) जीयूआई के साथ केवल प्रतिक्रिया के दौरान उपयोग किए जाने के दौरान उपयोग किया जाता है - अदृश्य/अक्षम/उत्पादन पर्यावरण में अवरुद्ध। – robert4

0

मुझे ऐसा नहीं लगता है।

असेंक/प्रतीक्षा टीपीएल को एक साथ बदलने के लिए नहीं किया गया था, लेकिन सरल संचालन क्लीनर बनाकर इसे पूरक करने के लिए।
यदि आपको अभी भी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता है, तो आपको कार्यों में रहना होगा, या आप इस व्यवहार के साथ एक कस्टम प्रतीक्षाकर्ता को लागू करने का प्रयास कर सकते हैं।

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