2013-08-21 30 views
5

के साथ फ्रीजिंग यूआई मेरे पास कुछ कोड चल रहा है जो लोड हो जाने पर विंडो को पकड़कर ले जाएं। मुझे यकीन नहीं है कि समस्या क्या है लेकिन सोचा कि मैं अपना कोड पोस्ट करूंगा क्योंकि मैं एसिंक/प्रतीक्षा के साथ काम करने में काफी नया हूं और बस सोच रहा हूं कि मेरे तर्क के साथ कुछ समस्या है या नहीं। मैं यह नहीं कह रहा हूं कि यह समस्या पैदा कर रहा है, मैंने अभी और अन्य समस्याओं को देखा है जो यूआई फ्रीजिंग और एसिंक/प्रतीक्षा के साथ अक्सर आते हैं। किसी भी सहायता की सराहना की जाएगी।async/await

private async void BuildChart() 
{ 
    DateTime date = DateTime.Today; 
    using (Database db = new Database()) 
    { 
     await BuildActual(date, db); 
     await BuildActual(date.AddDays(1),db); 
    } 
} 

private async Task BuildActual(DateTime date, Database db) 
{ 
    List<TimeSeries> actualValues = await Task<List<TimeSeries>>.Factory.StartNew(() => 
    { 
     try 
     { 
      var wind = DoStuff(date, db); 
      if (wind == null) return null; 
      if (wind.Count == 0) return null; 
      return MakeTimeSeries(wind); 
     } 
     catch 
     { 
      return null; 
     } 
    }); 

    try 
    { 
     if (actualValues == null) return; 
     DoMoreStuff(actualValues); 
    } 
    catch (Exception ex) 
    { 
     Logger.Log(ex); 
    } 
} 

धन्यवाद।

उत्तर

18

async जादूगर रूप से आपकी यूआई समस्याओं को गायब नहीं करता है, लेकिन यह निश्चित रूप से आपको प्रबंधित करने में आपकी सहायता करता है।

इस मामले में, अपने BuildActual विधि (जो should be namedBuildActualAsync) पहले एसिंक्रोनस रूप से एक पृष्ठभूमि धागा (जो should be using Task.Run instead of TaskFactory.StartNew) पर DoStuff और MakeTimeSeries के लिए इंतजार कर रहा है।

अभी तक, बहुत अच्छा है। प्रतिनिधि के निष्पादन को पूरा करने के बाद, BuildActual UI थ्रेड पर निष्पादन फिर से शुरू करता है और DoMoreStuff सिंक्रनाइज़ (उस थ्रेड पर) चलाता है।

इस प्रकार, आपकी समस्याओं की संभावना DoMoreStuff बहुत अधिक समय ले रही है। यदि आप अभी भी सुनिश्चित नहीं हैं, तो आवेदन प्रोफाइलिंग (या Debug.WriteLineStopwatch के साथ संयुक्त) आपको यूआई थ्रेड व्यस्त होने में अधिक अंतर्दृष्टि प्रदान करेगी।

पीएस आपको avoid async void भी होना चाहिए, क्योंकि मैं अपने एमएसडीएन आलेख में अधिक विस्तार से समझाता हूं।

पी.पी.एस. चूंकि आप async पर नए हैं, इसलिए मैं my own intro article की अनुशंसा करता हूं, जिसमें अंत में सर्वोत्तम अनुवर्ती संसाधनों (आईएमओ) के लिंक हैं।

+0

गहराई स्टार्टर गाइड/लिंक में धन्यवाद के लिए धन्यवाद। मुझे वास्तव में पता चला कि समस्या कोड से असंबंधित थी लेकिन लेखों ने ध्यान दिए बिना मदद की। – Kohins