2012-10-22 7 views
6

मैं सी # 5.0 के साथ अपना पहला ऐप बनाने के लिए उत्साहित था, और मैं एसिंक डेटा कॉल के दर्द को कम करने के लिए एसिंक/प्रतीक्षा कीवर्ड का उपयोग करना चाहता था।इंटरफेस में एसिंक कीवर्ड की कमी सी # 5.0 में DI को तोड़ती है?

मैं थोड़ा उलझन में हूं कि इंटरफेस एसिंक कीवर्ड को अनुबंध का हिस्सा होने की अनुमति नहीं देता है, क्योंकि प्रतीक्षा कीवर्ड केवल एसिंक चिह्नित विधियों के लिए काम करता है। इसका मतलब यह होगा कि इंटरफ़ेस संदर्भों के माध्यम से async विधियों को कॉल करना असंभव है। यह अमूर्त तरीकों के लिए भी जाता है। क्या मुझसे कोई चूक हो रही है? इसका मतलब यह होगा कि मेरे नियमित डि-सामान अब कार्य नहीं करेगा:

IAsyncRepository<T> { 
Task<IList<T>> GetAsync(); // no 'async' allowed 
} 

abstract class AsyncRepositoryBase<T> { 
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed 

// ग्राहक कोड:

IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>(); 
var items = await repo.GetAsync(); // DOOOOOH, will not compile! 

यह मेरे वर्तमान समाधान है:

public abstract class AsyncRepositoryBase<T> 
{ 
    protected Task<IList<T>> _fetcherTask; 

    protected AsyncRepositoryBase(Task<IList<T>> fetcherTask) 
    { 
     _fetcherTask = fetcherTask; 
    } 

    public virtual async Task<IList<T>> GetASync() 
    { 
     return await _fetcherTask; 
    } 
} 

मैं पड़ेगा अमूर्तता और लैंगेज सुविधा के बीच चयन करें? कृपया मुझे बताओ मुझे कुछ याद आ रही है।

+0

कोई भी अमूर्तता एक तरफ या दूसरी तरफ है। लेकिन यह कोई समस्या नहीं है, आपको केवल एसिंक पैटर्न को लागू करने का एक तरीका प्रदान करना होगा। रिटर्निंग IAsyncResult पर्याप्त है। –

उत्तर

7

await keyword only works for async marked methods

आपकी समस्या है। awaitasync विधि के अंदर होना चाहिए, यह किसी भी कार्य पर इंतजार कर सकता है, चाहे async के माध्यम से लागू किया गया हो या नहीं।

उदाहरण के लिए:

interface IFoo { 
    Task BarAsync(); 
} 

class Foo : IFoo { 
    public async Task BarAsync() { 
     // Implemented via async/await in this case. 
     // You could also have implemented it without async/await. 
    } 
} 

// ... 

async void Test() { 
    IFoo foo = ... ; 
    await foo.BarAsync(); // Works no matter how BarAsync is implemented. 
} 

अपने सिंटैक्स त्रुटि के लिए के रूप में: await repo.GetAsync(); // DOOOOOH, will not compile! - आप विधि async के रूप में कोड के इस टुकड़े युक्त चिह्नित करने के लिए भूल गए हैं (आप async रूप IAsyncRepository.GetAsync चिह्नित करने के लिए नहीं है)?

+0

धन्यवाद, यह मेरे पास था, लेकिन मुझे इस पर कंपाइलर त्रुटियां मिलीं। इसे दोबारा दोहराएं, और मुझे अब कोई त्रुटि नहीं है। डुनो अगर यह मेरा या कंपाइलर था, तो मैं कंपाइलर को दोष दूंगा और बिस्तर पर जाऊंगा। धन्यवाद :) – tuxbear

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