2016-04-22 12 views
14

मैं सोच रहा था कि एसिंक्रोनस कोड लिखने का सबसे अच्छा/सही तरीका क्या है जो दो (या अधिक) एसिंक और आश्रित (पहले को निष्पादित करने के लिए समाप्त होना है) ऑपरेशन से बना है।अनुक्रमिक प्रतीक्षा वीएस निरंतरता

async के साथ उदाहरण/का इंतजार है: निरंतरता के साथ

await RunFirstOperationAsync(); 
await RunSecondOperationAsync(); 

उदाहरण:

await RunFirstOperationAsync() 
    .ContinueWith(t => RunSecondOperationAsync()); 
+2

देखें [यह] (http://stackoverflow.com/questions/8767218/is-async-await-keyword-equivalent-to-a-continuewith-lambda) SO चर्चा –

उत्तर

15

आप await उपयोग करने के लिए करता है, तो आप संभवतः कर सकते हैं चाहेंगे।

ContinueWith में कई समस्याएं हैं। मैं why ContinueWith is dangerous पर अपने ब्लॉग पोस्ट में संक्षेप में इसका वर्णन करता हूं, जो why StartNew is dangerous पर मेरे पहले ब्लॉग पोस्ट पर बनाता है (वे कई मुद्दों को साझा करते हैं)।

विशेष रूप से:

  • ContinueWith एक अच्छा डिफ़ॉल्ट TaskScheduler जरूरत नहीं है। डिफ़ॉल्ट कार्य शेड्यूलर TaskScheduler.Current (TaskScheduler.Default नहीं) है, और वर्तमान SynchronizationContext पर फिर से शुरू होने पर वांछित होने पर हाथ से किया जाना चाहिए।
  • ContinueWith में गैर-आदर्श डिफ़ॉल्ट options है। एसिंक्रोनस कोड के लिए, आप कम से कम DenyChildAttach और ExecuteSynchronously चाहते हैं।
  • ContinueWith एसिंक्रोनस निरंतरता को समझ में नहीं आता है, जो आम तौर पर इस सीमा के आसपास काम करने के लिए अतिरिक्त Unwrap कॉल की आवश्यकता होती है।
  • ContinueWith अपने CancellationToken तर्क को एक आश्चर्यजनक तरीके से मानता है। मेरा in this blog post मेरा अधिक।

ये तर्क मेरे blog post on Task continuations पर सारांशित हैं। await में इनमें से कोई भी कमी नहीं है।

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