12

मैं सिर्फ SQL सर्वर पर कॉल करना चाहता हूं और वापसी की प्रतीक्षा नहीं करना चाहता हूं। मेरे पास एक संग्रहीत प्रक्रिया से एक आयातित इकाई फ़ंक्शन है जिसे मैं एंटिटी फ्रेमवर्क 6.0.0-आरसी 1 में इस तरह से असंकालिक रूप से कॉल करना चाहता हूं। क्या यह संभव है? वाक्यविन्यास क्या है?मैं ईएफ 6 एसिंक में एक इकाई संग्रहीत प्रक्रिया को कैसे ला सकता हूं और वापसी की प्रतीक्षा नहीं कर सकता?

Entity Function: RecalculateBudgetNumbers(int id) 
+0

एंटीटी-फ्रेमवर्क पर अटक न जाए! आप उन तरीकों का उपयोग एसिंक कर सकते हैं जैसे आप सब कुछ async का उपयोग कर सकते हैं। (टास्क.रुन, थ्रेड, एसिंक (4.5 से)) – Marguth

उत्तर

7
एक नया Task कि एक ताजा डेटा संदर्भ बनाता है और उस समारोह का आह्वान शुरू

। बस उस कार्य का इंतजार न करें/प्रतीक्षा करें। इसे पूरा करने के लिए खुद को चलाने दें।

त्रुटियों को लॉग इन करना सुनिश्चित करें। अपवादों को निगलें क्योंकि वे उन बग्स हो सकते हैं जिन्हें आप जानना चाहते हैं।

एएसपी.नेट सेटिंग में, जागरूक रहें कि कार्यकर्ता प्रक्रिया किसी भी समय रीसायकल कर सकती है, इसलिए आपका पृष्ठभूमि कार्य अचानक गायब हो सकता है (या रद्द किया जा सकता है)।

+0

मैंने कुछ कोड जोड़ा। जब मैं RecalculateBudgetNumbersAsync में प्रतीक्षा को हटाने का प्रयास करता हूं, वीएस मुझे चेतावनी देता है: क्योंकि इस कॉल की प्रतीक्षा नहीं है, कॉल पूरा होने से पहले वर्तमान विधि का निष्पादन जारी है। कॉल के परिणामस्वरूप 'प्रतीक्षा' ऑपरेटर को लागू करने पर विचार करें। मैं इसे वापसी के इंतजार किए बिना खुद को कैसे चला सकता हूं? – dirq

+0

आप पृष्ठभूमि कार्य का इंतजार कर रहे हैं जो निश्चित रूप से इसे गैर-पृष्ठभूमि बनाता है ... – usr

+1

@usr ने विभिन्न परीक्षणों का उपयोग करके काम करने के लिए अपना उदाहरण प्राप्त करने का प्रयास करने में काफी समय बिताया। मेरी async जरूरतों को dbcontext का उपयोग कर बचत शामिल है। ताजा डेटा संदर्भ का उपयोग करने की आपकी टिप्पणी ने बहुत मदद की। thx – user1019042

3

अहह। मैं एंटीटी फ्रेमवर्क भूमि में बहुत लंबा था। सुझावों के लिए धन्यवाद। यहां मेरे लिए क्या काम किया है। क्या आप इसके साथ कोई समस्या देखते हैं?

/// <summary> 
    /// kicks off the LONG RUNNING calculations on a budget to regenerate all pre-cooked numbers. 
    /// </summary> 
    /// <param name="budgetId">Budget Id</param> 
    public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsync(int budgetId) 
    { 
     await System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId)); 
    } 

    public static void RecalculateBudgetNumbers(int budgetId) 
    { 
     //this is static so we don't use the unit of work.. 
     using (BMTContext ctx = new BMTContext()) 
     { 
      ctx.UpdateLifeOfBudgetNumbers(budgetId);     
      ctx.UpdateIntervalNumbers(budgetId);     
      ctx.UpdateIntervalActivityNumbers(budgetId); 
      ctx.UpdateLifeOfBudgetActivityNumbers(budgetId); 
     } 
    } 

और मेरा परीक्षण (मैं विजुअल स्टूडियो 2012 में हूं इसलिए मैं एसिंक परीक्षण कर सकता हूं)।

[TestMethod] 
    public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsyncTest() 
    { 
     System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); 
     timer.Start(); 
     await repo.RecalculateBudgetNumbersAsync(budgetId); 

     System.Console.WriteLine("RecalculateBudgetNumbersAsyncTest milliseconds: " + timer.ElapsedMilliseconds.ToString()); 
    } 

मैट स्मिथ और उसर के सुझावों के बाद, मैंने RecalculateBudgetNumbersAsync को बदल दिया। मुझे आशा है कि उनका यही अर्थ है:

public void RecalculateBudgetNumbersAsync(int budgetId) 
    { 
     System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId)); 
    } 
+1

'RecalculateBudgetNumbersAsync' में 'async' /' प्रतीक्षा' कीवर्ड की कोई आवश्यकता नहीं है। उन्हें हटा दें और आपके पास समान कार्यक्षमता होगी। –

+0

एक सवाल - प्राथमिक धागा जारी करना और एक नया शुरू करना प्रदर्शन को कम नहीं करेगा !? ऐसा लगता है कि नया धागा फैलाने का एक उपर है और फिर बाद में प्राथमिक पर फिर से शुरू होता है, जब नया पूरा होता है। क्या यह? – sandiejat

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

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