2012-04-08 13 views
6

को ठंडा किए बिना लंबे कार्यों को चलाना मैं यूआई को फ्रीज किए बिना पृष्ठभूमि में कोई कार्रवाई करने की कोशिश कर रहा हूं।यूआई

बेशक, मैं इसके लिए पृष्ठभूमिवर्कर का उपयोग कर सकता हूं।

हालांकि, मैं इसे केवल कार्य API के साथ करना चाहता हूं।

मैंने कोशिश की:

async void OnTestLoaded(object sender, RoutedEventArgs e) 
{ 
    await LongOperation(); 
} 
// It freezes the UI 

और

async void OnTestLoaded(object sender, RoutedEventArgs e) 
{ 
    var task = Task.Run(()=> LongOperation()); 
    task.Wait(); 
} 


// It freezes the UI 

तो मैं BackgroundWorker के लिए वापस जाना चाहिए? या केवल कार्य का उपयोग कर समाधान है?

+0

इतने सारे लोग BackgroundWorker क्यों पसंद नहीं करते हैं? मुझे यह पसंद है और सिंटैक्स को सीधे ढूंढें। – Paparazzi

+0

'BackgroundWorker'' थ्रेड' से कहीं बेहतर है, लेकिन 'कार्य' आधारित API अंततः हावी हो जाएंगे। मेरे पास [एक संबंधित ब्लॉग पोस्ट] है (http://nitoprograms.blogspot.com/2010/08/various-implementations-of-asynchronous.html)। 'कार्य। रुन' के निम्नलिखित फायदे हैं: (1) घोंसले की अनुमति देता है; (2) रद्दीकरण समर्थन एकीकृत 'रद्दीकरण टोकन' प्रणाली का उपयोग करता है; (3) अपवादों को एक सही कॉल स्टैक के साथ अधिक स्वाभाविक रूप से प्रचारित किया जाता है; (4) परिणाम अधिक स्वाभाविक रूप से पुनर्प्राप्त किए जाते हैं; (5) कम संसाधनों का उपयोग करता है (समर्पित थ्रेड के बजाय थ्रेड पूल)। –

उत्तर

12

आप बहुत करीब थे।

async void OnTestLoaded(object sender, RoutedEventArgs e) 
{ 
    await Task.Run(() => LongOperation()); 
} 

asyncdoes not execute a method on a thread pool thread

Task.Run थ्रेड पूल थ्रेड पर एक ऑपरेशन निष्पादित करता है और Task उस ऑपरेशन का प्रतिनिधित्व करता है।

यदि आप Task.Waitasync विधि में उपयोग करते हैं, तो आप doing it wrong हैं। आपको awaitasync विधियों में कार्य करना चाहिए, कभी भी उन पर अवरुद्ध न करें।

+0

यदि आपने इस विशिष्ट उदाहरण में एसिंक का उपयोग नहीं किया है या इंतजार नहीं किया है तो क्या कोई अंतर होगा? – Lukazoid

+0

@ लुकाज़ॉयड: यदि आपका मतलब है कि 'कार्य' रून 'का इंतजार किए बिना, तो वह चुपचाप' लांगऑपरेशन 'से सभी अपवादों को निगल जाएगा। –

+0

लेकिन क्या अपवादों को वैसे भी निगल नहीं दिया जाएगा क्योंकि 'ऑनटेस्टलोडेड' एक 'async शून्य' है? आह, आगे पढ़ने से, ऐसा लगता है कि एसिंक शून्य का उपयोग करते समय, अपवाद को 'सिंक्रनाइज़ेशन कॉन्टेक्स्ट' पर शुरू किया जाएगा, बिना एसिंक/प्रतीक्षा के, इसे निगलने के रूप में निगल लिया जाएगा, क्या यह सही है? – Lukazoid