2012-01-03 15 views
11

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

मैं टीपीएल में अपवाद कैसे संभाल सकता हूं, क्योंकि मैंने कभी प्रतीक्षा नहीं की है() विधि? किसी भी अपवाद पर मुझे त्रुटि संदेश बॉक्स दिखाने की ज़रूरत है, और यह बॉक्स तुरंत फेंकने के बाद दिखाया जाना चाहिए।

मेरे पास हमेशा पृष्ठभूमि में एकल धागा है, इसलिए आप पहले थ्रेड को रोक दिए बिना स्टार्ट दबा नहीं सकते हैं।

मैं कुछ अच्छे पैटर्न या सर्वोत्तम अभ्यास की तलाश में हूं। मैं धागा अंदर try..catch जगह है, और प्रत्येक पकड़ पर एक घटना आह्वान करने के लिए एक विचार है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ इस तरह के दृष्टिकोण एक उच्च स्तर पर अच्छा वास्तुकला निर्णय

उत्तर

24

आप Tasks का उपयोग कर रहे हैं, तो आप एक निरंतरता है कि केवल अगर चलाता जोड़ सकते हैं एक अपवाद फेंक दिया जाता है। आप इसे अपने यूआई थ्रेड पर चलाने के लिए भी कह सकते हैं ताकि आप अपने यूआई नियंत्रणों का उपयोग कर सकें:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 
+0

यह वास्तव में अच्छी सुविधा है! धन्यवाद – Archeg

+0

@ आर्चेग आपका स्वागत है। –

3

है Wait विधि बस Exception लेता है जो पृष्ठभूमि धागे में हुआ, इसे Exception प्रकार में लपेटता है और इसे पुनर्स्थापित करता है। तो आप अपने तर्क कोड के आस-पास एक मानक try/catch ब्लॉक के साथ पृष्ठभूमि थ्रेड पर मूल Exception देख सकते हैं।

2

कार्य (पृष्ठभूमि धागे पर) में अपवाद को संभालने में कुछ भी गलत नहीं है। आप एक अपवाद की स्थिति में यूआई दिखाने की जरूरत है, तो आप डिस्पैचर (यह मानते हुए आप WPF या Silverlight का उपयोग कर रहे) का उपयोग कर सकते हैं: http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

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