दिलचस्प पोस्ट
स्मृति में MATLAB आंकड़े प्रस्तुत करना कैसे मेरे पुस्तकालय से निष्पादन योग्य में फोन कॉल करने के लिए? आईओएस परियोजना के साथ उपयोग करने के लिए बाहरी सी ++ पुस्तकालय संकलित करना लोकलहोस्ट के लिए एक विश्वसनीय स्वयं-हस्ताक्षरित SSL प्रमाणपत्र बनाएं (एक्सप्रेस / नोड के साथ उपयोग के लिए) पीएचएसेट से एनएसURL केवल एक पंक्ति डालना यदि वह पहले से ही नहीं है पॉलीमोर्फ़िक ऑब्जेक्ट्स के साथ सरणी के जेएसओएन सीरियललाइज़ेशन पायथन में पंडों में एक डाटाफ्रेम बंट कर रहा है "UseTaskFriendlySynchronizationContext" का क्या अर्थ है? संपूर्ण टेक्स्ट फ़ाइल को सी में एक चार सरणी में पढ़ना jQuery: स्क्रॉल के नीचे तक पहुंचने का पता लगाने में काम नहीं करता, केवल शीर्ष पर ही पता लगाता है क्रोम एक्सटेंशन से वर्तमान पृष्ठ का स्रोत HTML प्राप्त करना नेटबीन्स में विधि को सुपर () त्रुटि चाहिए अपने ज्ञात फ़ॉन्ट आकार और वर्णों के लिए WPF TextBlock चौड़ाई की गणना कैसे करें? KeyListener कुंजी संयोजन कैसे खोज सकते हैं (जैसे, ALT + 1 + 1)

अपवाद पकड़ो जिसे अलग थ्रेड में फेंका गया है

मेरी एक विधि (विधि 1) एक नया धागा पैदा करती है। यह धागा एक विधि ( Method2 ) को निष्पादित करता है और एक्सटेक्शन के दौरान एक अपवाद फेंक जाता है। मुझे कॉलिंग विधि ( Method1 ) पर उस अपवाद की जानकारी प्राप्त करने की आवश्यकता है

क्या कोई रास्ता नहीं है मैं Method1 में यह अपवाद पकड़ सकता हूँ जो Method2 में फेंक दिया गया है?

Solutions Collecting From Web of "अपवाद पकड़ो जिसे अलग थ्रेड में फेंका गया है"

.NET 4 और इसके बाद के संस्करण में, आप नया धागा बनाने के बजाय Task<T> वर्ग का उपयोग कर सकते हैं। उसके बाद आप अपने कार्य ऑब्जेक्ट पर अपवाद संपत्ति का उपयोग कर अपवाद प्राप्त कर सकते हैं। ऐसा करने के 2 तरीके हैं:

  1. एक अलग विधि में: // आप कुछ कार्य के धागे में अपवाद की प्रक्रिया करते हैं

     class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); task.Start(); Console.ReadLine(); } static int Test() { throw new Exception(); } static void ExceptionHandler(Task<int> task) { var exception = task.Exception; Console.WriteLine(exception); } } 
  2. उसी विधि में: // आप कॉलर के थ्रेड में अपवाद की प्रक्रिया करते हैं

     class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.Start(); try { task.Wait(); } catch (AggregateException ex) { Console.WriteLine(ex); } Console.ReadLine(); } static int Test() { throw new Exception(); } } 

ध्यान दें कि अपवाद जो आप प्राप्त करते हैं, वह है AggregateException । सभी असली अपवाद ex.InnerExceptions संपत्ति के माध्यम से ex.InnerExceptions हैं।

.NET 3.5 में आप निम्न कोड का उपयोग कर सकते हैं:

  1. // आप बच्चे के धागे में अपवाद की प्रक्रिया

     class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler)); thread.Start(); Console.ReadLine(); } private static void Handler(Exception exception) { Console.WriteLine(exception); } private static void SafeExecute(Action test, Action<Exception> handler) { try { test.Invoke(); } catch (Exception ex) { Handler(ex); } } static void Test(int a, int b) { throw new Exception(); } } 
  2. या // आप कॉलर के धागे में अपवाद की प्रक्रिया करते हैं

     class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception)); thread.Start(); thread.Join(); Console.WriteLine(exception); Console.ReadLine(); } private static void SafeExecute(Action test, out Exception exception) { exception = null; try { test.Invoke(); } catch (Exception ex) { exception = ex; } } static void Test(int a, int b) { throw new Exception(); } } 

आप Method1 में अपवाद को नहीं पकड़ सकते हालांकि, आप Method2 में अपवाद को पकड़ सकते हैं और उसे एक चर में रिकॉर्ड कर सकते हैं कि निष्पादन का मूल धागा तब पढ़ और उसके साथ काम कर सकता है।

विभिन्न धागे के बीच डेटा साझा करने के लिए सरलतम विधि shared data निम्नानुसार है (कुछ छद्म कोड है):

 class MyThread { public string SharedData; public void Worker() { ...lengthy action, infinite loop, etc... SharedData = "whatever"; ...lengthy action... return; } } class Program { static void Main() { MyThread m = new MyThread(); Thread WorkerThread = new Thread(m.Worker); WorkerThread.Start(); loop//or eg a Timer thread { f(m.SharedData); } return; } } 

आप इस पद्धति के बारे में मल्टीथ्रेडिंग के बारे में अच्छी शुरुआत में पढ़ सकते हैं, फिर भी, मैं इसके बारे में O'Reilly book C# 3.0 in a nutshell भाइयों के अल्बाहारी (2007) के द्वारा पढ़ना पसंद किया, जो कि Google पुस्तकें पर भी आसानी से उपलब्ध है, बस किताब के नए संस्करण की तरह, क्योंकि इसमें थ्रेड पूलिंग, अग्रभूमि बनाम पृष्ठभूमि थ्रेड्स, इत्यादि आदि, अच्छा और सरल उदाहरण कोड के साथ। (अस्वीकरण: मैं इस पुस्तक की एक पहना-आउट प्रति है)

यदि आप WinForms एप्लिकेशन बना रहे हैं, तो साझा डेटा का उपयोग विशेष रूप से आसान है, क्योंकि WinForm नियंत्रण थ्रेड्स-सुरक्षित नहीं हैं। वर्कर थ्रेड से डेटा को एक WinForm नियंत्रण में वापस करने के लिए कॉलबैक का उपयोग करना मुख्य यूआई थ्रेड की जरूरत है, जो कि नियंत्रण थ्रेड- Invoke() बनाने के लिए Invoke() के साथ बदसूरत कोड की आवश्यकता होती है। इसके बजाय साझा किए गए डेटा का उपयोग करना, और एकल-थ्रेडेड System.Windows.Forms.Timer , जिसमें एक लघु Interval के साथ 0.2 सेकंड का कहना है, आप आसानी से कार्यकर्ता धागे से बिना Invoke के नियंत्रण में जानकारी भेज सकते हैं।

आप इस तरह से कुछ का उपयोग कर सकते हैं:

 Thread thread = new Thread(delegate() { try { MyIPoller.Start(); } catch(ThreadAbortException) { } catch(Exception ex) { //Handle } finally { } }); 

यह सुनिश्चित करेगा कि यह अपवाद धागा के शीर्ष पर नहीं बना।