2013-02-24 8 views
5

मैं अपने एंटिटी मॉडल में आयातित संग्रहीत प्रक्रियाओं/फ़ंक्शन आयातों के लिए नई async प्रतीक्षा कार्यक्षमता को लागू करना चाहता हूं, लेकिन अभी तक ईएफ 6 अल्फा के साथ असमर्थ रहा है।ईएफ 6 अल्फा Async एक इकाई संग्रहीत प्रक्रिया/समारोह आयात पर प्रतीक्षा करें?

क्या एटीटी फंक्शन आयात (जो एसक्यूएल संग्रहीत प्रक्रिया को कॉल करता है) पर किसी भी नई Async विधियों को कॉल करने के लिए EF6 अल्फा 2 (या रात में 20211 के रूप में निर्मित) में अभी तक संभव है, जो जटिल प्रकार का संग्रह देता है? जैसे

private async Task<IList<Company>> getInfo (string id) 
{ 
    using (CustomEntity context = new CustomEntity()) 
    { 
     var query = await context.customStoredProcedure(id).ToListAsync(); 
     // ".ToListAsync()" method not available on above line 

     // OR ALTERNATIVELY 
     var query = await (from c in context.customStoredProcedure(id) 
          select new Company 
          { 
           Ident = c.id, 
           Name = c.name, 
           Country = c.country, 
           Sector = c.sector, 
           etc. etc.... 
          }).ToListAsync(); 
     // ".ToListAsync()" method or any "...Async" methods also not available this way 

     return query; 
    } 
} 

"ToListAsync", या नए async संशोधित विधियों में से किसी भी संग्रहित प्रक्रिया/समारोह आयात ऊपर इकाई के लिए उपलब्ध होने लगते हैं नहीं है, केवल मानक "ToList" या "AsNumerable" आदि विधियां उपलब्ध हैं।

मैंने यह सुनिश्चित करने के लिए कोड (http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6) का पालन किया है ताकि यह सुनिश्चित किया जा सके कि कोड नए ईएफ 6 डीएलएस का संदर्भ दे रहा है और ईएफ 5 नहीं, साथ ही साथ विभिन्न उपयोग कथनों को अपडेट किया गया है। उपरोक्त के अलावा, सब ठीक से बनाता है। (.NET Framework 4.5)

केवल एक बार जब मैं एसिंक विधियों को देख सकता हूं तो डीबी से संग्रहीत प्रक्रियाओं को आयात करने की बजाय, मैं एक तालिका भी आयात करता हूं - फिर उस तालिका को उपरोक्त संदर्भ संदर्भ के माध्यम से संदर्भित करते समय (संदर्भ। कुछ योग्य), कुछ async विधियों intellisense में दिखाई देते हैं।

मैं जेएसओएन के रूप में डेटा लौटने से पहले कई संग्रहीत प्रक्रियाओं पर नई एसिंक प्रतीक्षा कार्यक्षमता का उपयोग शुरू करना चाहता हूं, लेकिन अब तक इसे काम करने में सक्षम नहीं हूं।

क्या मैं कुछ गलत कर रहा हूं? एंटिंक कार्यक्षमता एंटिटी संग्रहीत प्रक्रिया/फ़ंक्शन आयात पर संभव नहीं है? आपके सुझाव के लिए धन्यवाद।

+0

'context.customStoredProcedure (id)' का किस प्रकार का स्थिरता है? – usr

+0

सिस्टम।Data.Entity.Core.Objects.ObjectResult blueFish

+0

क्या आपने कभी इसे काम किया है? मेरे पास एएसवाईएनसी होने की आवश्यकता वाली स्टोर्ड प्रो के साथ एक ही समस्या है। –

उत्तर

4

अब यह किसी भी तरह का सबसे अच्छा समाधान नहीं है। मैंने एक विस्तार विधि जोड़ा ताकि मैं अपनी संग्रहीत प्रक्रियाओं पर प्रतीक्षा कर सकूं। ईएफ 6.1 + की नई रिलीज में हमें इसे आधिकारिक रूप से लागू करना चाहिए। तब तक एक डमी विस्तार विधि नौकरी करता है।

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source) 
{ 
    var list = new List<T>(); 
    await Task.Run(() => list.AddRange(source.ToList())); 
    return list; 
} 

आप एफई के 6 संस्करण को प्रतिबिंबित तो आपको लगता है कि वास्तव में ObjectResult<T>IDbAsyncEnumerable<T>, IDbAsyncEnumerable लागू करता है देखेंगे। और ToListAsync<T>(this IDbAsyncEnumerable<T> source) के लिए विधि को LINQ क्वेरी के समान तार करने में सक्षम होना चाहिए।

जब ऑब्जेक्ट रिसेट खाली खाली हो जाता है। यदि आप शून्य की बजाय खाली सूची वापस करना चाहते हैं तो आप if (source == null) return new List<T>(); जोड़ सकते हैं।

+4

'टास्क.रुन' के साथ एक नया धागा फैला रहा है ताकि आप एक विधि का "इंतजार कर सकें" पूरी तरह से async/await के उद्देश्य को हरा देता है। आपने प्रतीक्षा करके अपना प्राथमिक धागा जारी किया लेकिन फिर आपने एक नया धागा पैदा किया। जब आप इस नए धागे को फैलाने के लिए ओवरहेड में कारक करते हैं तो अंततः आपका प्रदर्शन खराब हो जाएगा और आखिर में प्राथमिकता पर फिर से शुरू हो जाएगा जब आपने पूरा किया था। – TugboatCaptain

0

यह एक पुराना धागा है, लेकिन मुझे लगा कि मुझे साझा करना चाहिए। आपको एपीएम का उपयोग करना चाहिए और फिर कार्य में सिंक्रोनस कॉल को लपेटना चाहिए।

उदाहरण:

//declare the delegate 
private delegate MyResult MySPDelegate(); 

// declare the synchronous method 
private MyResult MySP() 
{ 
    // do work... 
} 

फिर एक टास्क में तुल्यकालिक विधि लपेट:

var MyResult = await MySPAsync(); 

आप उपयोग कर सकते हैं:

// wraps the method in a task and returns the task. 
public Task<MyResult> MySPAsync() 
{ 
    MySPDelegate caller = new MySPDelegate(MySP); 
    return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null); 
} 

कॉल async विधि जब आप निष्पादित करने के लिए चाहते हैं विधियों में तीन (3) पैरामीटर के लिए। सर्वोत्तम अभ्यास यह है कि यदि आप तीन से अधिक पैरामीटर का उपयोग करते हैं; आपको कक्षा में जाना चाहिए।

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