2013-09-06 10 views
8

में पैरामीटर मान्य करें मैं एक कक्षा लिख ​​रहा हूं जिसमें एक ही विधि void MyMethod(object argument) और Task MyMethodAsync(object argument) के सिंक्रोनस और असीमित संस्करण हैं। सिंक संस्करण में मैं सरल चेकएसिंक विधि

if (argument == null) 
    throw new ArgumentNullException("argument"); 

उसी जांच को एसिंक विधि में कैसा दिखना चाहिए?

1) सिंक विधि के समान हैं

2) (पहले उत्तर के बाद अपडेट किया गया)

if (argument == null) 
    return new Task.Factory.StartNew(() => { throw new ArgumentNullException("argument"); }); 

उत्तर

6

कि जब आप चाहते हैं त्रुटि उठाया जा पर थोड़ा निर्भर करता है - बेसब्री आयरलैंड या भाग के रूप में प्रतीक्षा करने योग्य

public Task<int> SomeMethod(..args..) { 
    if(..args fail..) throw new InvalidOperationException(...); 
    return SomeMethodImpl(...args...); 
} 
private async Task<int> SomeMethodImpl(...args...) 
{ 
    ... await etc ... 
} 

यह तो प्रारंभिक कॉल, awaitable नहीं के हिस्से के रूप में किसी भी तर्क जाँच प्रदर्शन करेंगे: iterator ब्लॉक के साथ के रूप में, यदि आप उत्सुक त्रुटि जाँच चाहते हैं, आप दो तरीकों, उदाहरण के लिए की जरूरत है। आप अपवाद awaitable का हिस्सा बनना चाहते हैं, तो आप बस इसे फेंक कर सकते हैं:

public async Task<int> SomeMethod(..args..) { 
    if(..args fail..) throw new InvalidOperationException(...); 
    ... await etc ... 
} 

हालांकि, अपने उदाहरण में, तथ्य यह है कि आप return ing एक Task पता चलता है कि यह वास्तव में एक async तरीका नहीं है कर रहे हैं, लेकिन async (लेकिन async नहीं) विधि है। तुम बस ऐसा नहीं कर सकते:

return new Task(() => { throw new ArgumentNullException("argument"); }); 

क्योंकि उस Task शुरू कर दिया जाएगा कभी नहीं किया गया है - और कभी नहीं होगा। मैं संदिग्ध आप की तरह कुछ करने के लिए की आवश्यकता होगी:

try { 
    throw new InvalidArgumentException(...); // need to throw to get stacktrace 
} catch(Exception ex) { 
    var source = new TaskCompletionSource<int>(); 
    source.SetException(ex); 
    return source.Task; 
} 

है जो ... एक कौर का एक सा है और शायद थोड़ा बेहतर समझाया जा सकता है। यह Task वापस करेगा जो इंगित करता है कि यह Faulted स्थिति में है।

+0

लक्ष्य ढांचा 4.0 है इसलिए मैं एसिंक का उपयोग नहीं कर रहा हूं और कीवर्ड का इंतजार कर रहा हूं – Demarsch

+0

दूसरा विकल्प कार्य के रूप में लिखा जाना चाहिए। फैक्टरी.स्टार्टन्यू (() => {throw ...}); इसे – Demarsch

+0

@Demarsch में अपडेट किया गया है [Microsoft.Bcl.Async] (https://www.nuget.org/packages/Microsoft.Bcl.Async) और 'async'/'await' ठीक काम करेगा –

3

बस सिंक विधि में किए गए जैसे ही इसे फेंक दें, टीपीएल में अपवाद को फिर से फेंकने के लिए विभिन्न तंत्र हैं, उदाहरण के लिए जब आप पढ़ते हैं। Result संपत्ति या एक्सेस। Exception संपत्ति।

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