2012-11-12 13 views
5

मैंने ईएफ 6, एसिंक विधियों में एक नई सुविधा देखी है। मुझे एक उदाहरण मिलता है।ईएफ में इन दो एसिंक कॉल के बीच क्या अंतर है?

यह पहला रास्ता, सामान्य कॉल है, उदाहरण के लिए EF5 साथ:

public Store FindClosestStore(DbGeography location) 
{ 
    using (var context = new StoreContext()) 
    { 
     return (from s in context.Stores 
      orderby s.Location.Distance(location) 
      select s).First(); 
    } 
} 

और EF6 में async विधि के साथ नई कॉल,।

public async Task<Store> FindClosestStore(DbGeography location) 
{ 
    using (var context = new StoreContext()) 
    { 
     return await (from s in context.Stores 
      orderby s.Location.Distance(location) 
      select s).FirstAsync(); 
    } 
} 

हालांकि, मैं निम्न कर सकते हैं (Syntaxis aprox है, मैं इसे स्मृति से करते हैं):

public async Task<Store> MyAsyncMethod(DbGeography location) 
{ 
    return await Task.Run(() => FindClosestStore()); 
} 

मेरा मतलब है, कि मैं Task.Run उपयोग कर सकते हैं पहली विधि कॉल करने के लिए, परिणाम का इंतजार करने के लिए कोई एसिंक नहीं है। फिलहाल, जिस तरह से मैं एसिंक को किसी भी विधि को कॉल करने के लिए उपयोग करता हूं, न केवल ईएफ। यह एक एसिंक कॉल भी है या वास्तव में एसिंक कॉल है जब मैं ईएफ 6 एसिंक विधि का उपयोग करता हूं?

ईएफ 6 के नए संस्करण में एसिंक तरीकों की आवश्यकता क्यों है? केवल सादगी के लिए?

+0

async और प्रतीक्षा सिंटेक्टिकल चीनी हैं, नेट 4.5 में नया, आप –

उत्तर

9

यहां अंतर यह है कि कोड कैसे इंतजार कर रहा है।

इस कोड के में:

public async Task<Store> FindClosestStore(DbGeography location) 
{ 
    using (var context = new StoreContext()) 
    { 
     return await (from s in context.Stores 
      orderby s.Location.Distance(location) 
      select s).FirstAsync(); 
    } 
} 

एफई डेटाबेस के खिलाफ एक प्रश्न जारी है, और वापस आ जाएगी।

परिणाम मिलने के बाद, कार्य पूरा हो जाएगा और प्रतीक्षा ब्लॉक निष्पादित रहेगा।

यही है, .NET में कोई धागा नहीं है जो प्रतिक्रिया की प्रतीक्षा कर रहा है। डीबी चालक से निम्न स्तर की कॉलबैक (उम्मीद है) है जो परिणाम आने पर .NET को सूचित करता है।

(यह कम से कम कैसे अन्य async आईओ .NET में काम करता है, और मुझे लगता है ADO.NET async के लिए एक ही)

अन्य मामले में:

public async Task<Store> MyAsyncMethod(DbGeography location) 
{ 
    return await Task.Run(()=> FindClosestStore()); 
} 

एक धागा नहीं होगा डीबी से प्रतिक्रिया के लिए इंतजार कर रहा है। यानी, आप आईओ को अवरुद्ध कर देंगे लेकिन यह उपभोक्ता से आपके कार्य के साथ छुपाया जाएगा। ट्रिक चाल।

दोनों मामले उपभोक्ता के लिए समान व्यवहार करेंगे, अंतर यह है कि आप पिछले उदाहरण में संसाधनों को गले लगा रहे हैं।

+0

जारी रखने के साथ कार्य द्वारा ऐसा कर सकते हैं। मुझे लगता है कि async/await का उपयोग एक नए थ्रेड के उपयोग से बचने की आवश्यकता से बचें। कभी-कभी बनाया जाता है और कभी-कभी नहीं (स्यूशन पर निर्भर करता है)। वास्तव में, डब्ल्यूसीएफ के साथ, अनुरोध की सेवा के दौरान संसाधनों को रिहा करने के लिए इसे एसिंक/प्रतीक्षा पैटर्न का उपयोग किया जाता है। ईएफ के साथ यह वैसे ही काम करेगा, अनुरोध करते समय संसाधनों को मुक्त करें? –

+2

अंतिम कोड नमूने में, एक अवरुद्ध धागा होगा क्योंकि यह non async EF विधियों का उपयोग करता है। भले ही आप उस कॉल को एसिंक/प्रतीक्षा ब्लॉक में लपेटें। अर्थात्। "FindClosestStore()" दृश्यों के पीछे एक थ्रेड को अवरुद्ध करेगा –

+0

और यह एसीएनसी/प्रतीक्षा के दौरान डब्ल्यूसीएफ में नहीं होता है? EF5 के साथ async का उपयोग करने का कोई तरीका है? –