2012-10-08 20 views
12

एक WPF 4.5 आवेदन में, मुझे समझ नहीं आता क्यों यूआई अवरुद्ध है जब मैं इंतजार + एक काम के लिए इस्तेमाल किया:मेरे async कार्य हमेशा ब्लॉक यूआई

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Task.Delay works great 
     //await Task.Delay(5000); 

     double value = await JobAsync(25.0); 

     MessageBox.Show("finished : " + value.ToString()); 
    } 

    private async Task<double> JobAsync(double value) 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    } 

का इंतजार Task.Delay अच्छा काम करता है, लेकिन जॉबएसिंक यूआई को अवरुद्ध करने का इंतजार है। क्यूं कर ? धन्यवाद।

उत्तर

9

इस प्रयास करें:

private Task<double> JobAsync(double value) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    }); 
} 
+2

बजाय विधि इसे और अधिक हो सकता है के अंदर कार्य शुरू करने 'प्रतीक्षा' के साथ लाइन पर 'टास्क.रुन' कॉल जोड़ने का अर्थ है, हालांकि अंतिम परिणाम (यदि फ़ंक्शन का पुन: उपयोग नहीं किया जाता है) समान है। – Servy

+2

Im इसी तरह के परिदृश्य में, अभी भी यूआई थ्रेड को अवरुद्ध करता है। क्या कोई स्पष्ट गेटचास है? – IbrarMumtaz

23

आप एक चेतावनी के बारे में JobAsync हो रही किया जाना चाहिए - यह कोई await भाव होता है। सभी आपका काम अभी भी यूआई थ्रेड पर किया जा रहा है। विधि के बारे में असीमित कुछ भी वास्तव में नहीं है।

async के रूप में एक विधि को चिह्नित करने से यह एक अलग थ्रेड पर नहीं चलता है - यह अधिक है कि यह असीमित परिचालनों में एक साथ जुड़ना आसान बनाता है, और उचित संदर्भ पर वापस आ जाता है।

मुझे लगता है कि यह एक अच्छा एक कदम पीछे जाएं और MSDN ... this is a good starting point पर async के बारे में सामग्री में से कुछ को अवशोषित करने के विचार होगा ...

+0

ठीक है धन्यवाद, अब मैं समझता हूं :) – Nico

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