2010-06-01 14 views
6

द्वितीयक थ्रेड में अपवाद होने पर मुख्य थ्रेड में अपवाद कैसे प्राप्त करें?द्वितीयक थ्रेड में अपवाद होने पर मुख्य थ्रेड में अपवाद कैसे प्राप्त करें?

परिदृश्य के लिए कोड का टुकड़ा नीचे दिया गया है

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Thread th1 = new Thread(new ThreadStart(Test)); 
     th1.Start();    
    } 
    catch (Exception) 
    { 

    } 
} 

void Test() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     Thread.Sleep(100); 

     if (i == 2) 
      throw new MyException(); 
    } 
} 
+0

आप नहीं कर सकते। एक के लिए, जब तक अपवाद फेंक दिया जाता है, कोशिश करें ... मुख्य धागे में पकड़ पहले ही पूरा हो चुका है। –

उत्तर

3

आप एक Application.ThreadException ईवेंट हैंडलर जोड़ सकते हैं:

जो सही है। ऊपर खिड़कियों को देखते हुए मैं Windows रूपों संभालने था कोड फॉर्म:

इस घटना को अपने Windows Forms अन्यथा बिना क्रिया अपवाद में होते हैं विंडोज फॉर्म्स धागे को संभालने के लिए आवेदन की अनुमति देता है। इन अपवादों, से निपटने के लिए अपने ईवेंट हैंडलर को थ्रेडएक्सप्शन ईवेंट से अटैच करें, जो में अज्ञात स्थिति में आपका एप्लिकेशन छोड़ देगा। जहां संभव हो, अपवादों को संरचित अपवाद हैंडलिंग ब्लॉक द्वारा संभाला जाना चाहिए।

देखें Unexpected Errors in Managed Applications

+1

मुझे लगता है कि यह जवाब गलत है। AFAIK (लेकिन मेरे पास इसका परीक्षण करने का समय नहीं है), एप्लिकेशन। थ्रेडएक्सप्शन केवल यूआई थ्रेड से अपवादों को संभालता है (उदाहरण के लिए WinForms नियंत्रण के लिए इवेंट हैंडलर में एक अनचाहे अपवाद)। कार्यकर्ता धागे से अपवादों को एक AppDomain.UnhandledException ईवेंट हैंडलर द्वारा संभाला जा सकता है, लेकिन हैंडलर कार्यकर्ता थ्रेड पर चलाएगा, मुख्य UI थ्रेड नहीं। यदि आप WinForms UI थ्रेड पर वर्कर थ्रेड से अपवादों को संभालना चाहते हैं, तो सबसे अच्छा समाधान पृष्ठभूमि उत्तर का उपयोग करना है जैसा कि मेरे उत्तर में दर्शाया गया है। – Joe

+0

जो कि एएसपी.NET कोड को विंडोज फॉर्म के रूप में आसानी से हो सकता है। यह छद्म कोड भी हो सकता है। –

+0

सच है। मैं वर्तमान में विनफॉर्म पर काम कर रहा हूं, इसलिए सब कुछ Winforms की तरह दिखता है! –

2

एक BackgroundWorker का प्रयोग करें।

एक पृष्ठभूमिवर्कर मुख्य यूआई थ्रेड और पृष्ठभूमि कार्यकर्ता थ्रेड के बीच संचार के लिए आधारभूत संरचना प्रदान करता है, जिसमें रिपोर्टिंग अपवाद भी शामिल हैं। बटन_क्लिक ईवेंट हैंडलर से धागा शुरू करने से यह लगभग हमेशा बेहतर समाधान होता है।

+0

"??????????" - एक पृष्ठभूमिवर्कर मुख्य यूआई थ्रेड और पृष्ठभूमि कार्यकर्ता थ्रेड के बीच संचार के लिए आधारभूत संरचना प्रदान करता है, जिसमें रिपोर्टिंग अपवाद भी शामिल हैं। ओपी के नमूने की तरह बटन_क्लिक घटना हैंडलर से धागा शुरू करने से यह लगभग हमेशा बेहतर समाधान होता है। – Joe

+2

सुनिश्चित करें ... तो इसे अपने उत्तर में रखें :)। यह नहीं कि एक संदर्भ खराब है, लेकिन एक स्पष्टीकरण भी बेहतर है! – Kiril

0

यदि आप वैश्विक रूप से सभी अपवादों को फँसाने के बारे में चिंतित हैं, तो आप जानकारी को बुलबुला करने के लिए एक असीमित प्रतिनिधि का भी उपयोग कर सकते हैं।

धागा बी में here

कहना है कि, जाल अपवाद के लिए देखें और ए इस तरह जब अपवाद से डेटा नियंत्रित किया जाता है विशेष रूप से लक्षित कर सकते हैं कर सकते हैं सूत्र में बाँधना बुलबुला जानकारी के लिए Async प्रतिनिधि का उपयोग करें।

0

जैसा कि @codeka ने कहा, आप नहीं कर सकते। लेकिन यदि आप माध्यमिक थ्रेड में कैच ब्लॉक में कुछ यूआई सामान (उपयोगकर्ता को एक त्रुटि संदेशबॉक्स प्रदर्शित कर सकते हैं) करना चाहते हैं, तो आप इस तरह संलग्न कर सकते हैं। बेहतर अगर आप BackgroundWorker

Invoke(new Action(() => 
{ 
    MessageBox.Show("Message"); 
})); 
1

का उपयोग आप अपने परीक्षा पद्धति में अपने अपवाद हैंडलिंग जोड़ने पर विचार करें और वहाँ अपवादों के साथ सौदा करना चाहिए।

मुफ्त Threading in C# ईबुक इस दृष्टिकोण (और कुछ अन्य) पर चर्चा करता है। 'अपवाद हैंडलिंग' अनुभाग पर नीचे स्क्रॉल करें।

0

आप कर सकते हैं (अब है & hellip; इस उपलब्ध जब प्रश्न मूल रूप से कहा गया था नहीं था) async और await का उपयोग करें:

private async void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     await Task.Run(Test); 
    } 
    catch (Exception) 
    { 

    } 
} 

Task.Run() विधि Test() विधि एक कार्यकर्ता सूत्र में निष्पादित करने के लिए कारण होगा। यदि उस थ्रेड में एक अनचाहे अपवाद फेंक दिया गया है, तो Task उस अपवाद को await कथन पर प्रतीक्षा थ्रेड पर प्रसारित करेगा।

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