2012-08-08 15 views
14

मैं एक अतुल्यकालिक विधि हैएसिंक्रोनस विधि से आउटपुट लौटने पर अनुशंसित विधि हस्ताक्षर?</p> <pre><code>public async Task<BitmapSource> GetBitmapAsync(double[] pixels); </code></pre> <p>चलो कहते हैं कि मैं भी इस वर्ग करते हैं:

public class PixelData 
{ 
    public double[] Pixels { get; } 
} 

अब मैं एक सुविधा एक BitmapSource उत्पादन उत्पादन, ऊपर अतुल्यकालिक विधि का उपयोग करने के लिए विधि बनाना चाहते हैं काम। मैं ऐसा करने के लिए कम से कम तीन दृष्टिकोण के साथ आ सकता हूं, लेकिन यह मेरे लिए तुरंत स्पष्ट नहीं है कि मुझे एक दक्षता और विश्वसनीयता के दृष्टिकोण से कौन सा चयन करना चाहिए।

कोई सलाह दे सकता है; निम्नलिखित दृष्टिकोणों में से प्रत्येक के फायदे और दोष क्या हैं?

विकल्प ए एक तुल्यकालिक विधि है कि Task की Result रिटर्न बनाएँ:

public BitmapSource GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels).Result; 
} 

विकल्प बी एक तुल्यकालिक बनाएं (या इसे अतुल्यकालिक है?) विधि है कि Task<BitmapSource> रिटर्न:

public Task<BitmapSource> GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels); 
} 
public async Task<BitmapSource> GetBitmapAsync(PixelData pixelData) 
{ 
    return await GetBitmapAsync(pixelData.Pixels); 
} 
+0

से ज्यादा कुछ भी प्राप्त नहीं करता है और आप इस सुविधा विधि एसिंक्रोनस रूप से भी कॉल करने के लिए सक्षम होना चाहते हैं? यदि हां, तो मैं इसके चेहरे पर जो देख सकता हूं उससे पहले दो विकल्प इसे प्राप्त नहीं करेंगे, केवल तीसरी इच्छा होगी। –

+0

जरूरी नहीं है (क्या मैं सुविधा विधि को असीमित रूप से कॉल करना चाहता हूं), लेकिन यदि यह करने का सबसे विश्वसनीय/सही तरीका है, तो हाँ। –

+0

@AdamHouldsworth इस मामले में मेरी अज्ञानता के लिए खेद है, लेकिन विकल्प बी को निश्चित_ के लिए एक तुल्यकालिक विधि के रूप में संभाला जाएगा? तथ्य यह है कि यह 'कार्य <बिटमैप स्रोत>' देता है, क्या यह (ए) समकालिकता के संबंध में अप्रासंगिक है? –

उत्तर

6

मुझे लगता है कि आप इस अति-सोच रहे हैं:विकल्प सी एक अतुल्यकालिक विधि है कि स्पष्ट रूप से await का उपयोग किया गया।

आपके पास एक ऐसी विधि है जो Task<T> होने के लिए एक प्रकार लौटाती है। आप एक विधि चाहते हैं जो एक अलग प्रकार का पैरामीटर लेता है और मूल विधि के माध्यम से गुजरता है। तो विकल्प बी ठीक है: हालांकि

public Task<BitmapSource> GetBitmap(PixelData pixelData) 
{ 
    return GetBitmapAsync(pixelData.Pixels); 
} 

विधि GetBitmapAsync बुलाया जाना चाहिए।

विकल्प ए विधि के सिंक्रोनस (अवरुद्ध) संस्करण का पर्दाफाश करने का तरीका होगा।

विकल्प सी वास्तव में विकल्प बी

+0

धन्यवाद, निकोलस! क्या यह भी विकल्प है कि विकल्प सी विकल्प बी से _worse_ है, जिसमें यह अनावश्यक असीमित हैंडलिंग जोड़ देगा? या दो विकल्प आंतरिक रूप से बराबर हैं? –

+1

आपका स्वागत है और हाँ - विकल्प सी बस ओवरहेड जोड़ता है। –

+2

इसके अलावा, विकल्प ए [deadlocks का कारण बन सकता है] (http://nitoprograms.blogspot.com/2012/07/dont-block-on-async-code.html)। स्टीफन टब के पास [एसिंक प्रदर्शन पर अच्छा वीडियो] है (http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-829T), और वह बताता है कि विकल्प सी एक अच्छा विचार नहीं है (ओवरहेड कारणों से) । –