2010-03-04 14 views
5

मेरे पास एक कार्यकर्ता धागा है जो मेरे आवेदन के लिए महत्वपूर्ण है।
यह new Thread(method).Start(); के साथ बनाया गया है, मैं इसमें शामिल नहीं हूं, मुझे उम्मीद है कि जब तक मेरा प्रोग्राम चलता है तब तक यह चलता है।
हालांकि, ऐसा हो सकता है कि इस धागे पर एक अपवाद पकड़ा गया है; और एक धागे के रूप में धागा (कुछ अंतिम लॉगिंग के बगल में) बंद हो जाएगा। इस गंभीर त्रुटि के लिए एक पुनर्प्राप्ति संभव नहीं है। चूंकि थ्रेड ऐप के लिए महत्वपूर्ण है, इसलिए इसे भी बंद करना होगा।एक महत्वपूर्ण कार्यकर्ता धागा की निगरानी कैसे करें

अब मेरा प्रश्न है: मैं अपने धागे की स्थिति की निगरानी कैसे कर सकता हूं?

क्या आप

  • पोल IsAlive संपत्ति?
  • पकड़े गए अपवाद को पुनर्स्थापित करें और AppDomain.CurrentDomain.UnhandledException के साथ काम करें?
  • event लागू करें जो मेरे पृष्ठभूमि धागे के अंत को इंगित करेगा?
  • BackgroundWorker का उपयोग करें, जो RunWorkerCompleted लागू करता है? (लेकिन क्या पृष्ठभूमिवर्कर वास्तव में लंबे समय तक चलने वाले धागे के लिए सही विकल्प है?)
  • कुछ completley अलग है?

संपादित करें: ->दुर्घटना जल्दी और अक्सर
अभी, मैं इस समस्या Application.Exit() फोन करके हल किया। यही कारण है कि एक विकल्प भी है :)

उत्तर

2

क्यों आप इस तरह अपने मुख्य थ्रेड दिनचर्या लपेट नहीं है:

void ThreadStart() 
{ 
     try 
     { 
      ThreadImplementation();   
     } 
     catch (Exception e) 
     { 
      mainForm.BeginInvoke(OnBackgroundThreadException, e); 
     } 
} 

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

+0

लेकिन मैं एक नियंत्रण के लिए एक संदर्भ की जरूरत है - केवल इस purpuse के लिए: एक नियंत्रण/ – tanascius

+0

यूआई थ्रेड पर कोड निष्पादित करने का एक सुविधाजनक तरीका है। सभ्य रूप से एकमात्र रास्ता नहीं है। आम तौर पर आपको किसी बिंदु पर वापस स्विच करने की आवश्यकता होती है, मैं ASAP को पसंद करता हूं। –

2

अपने धागा के अपवाद संचालक के अंत में, अपने मुख्य थ्रेड पर एक कॉलबैक विधि आह्वान और कार्यकर्ता को पुनः आरंभ:

public delegate void AbnormalExitDelegate(object errorArgs); 

class Boss 
{ 
    Worker worker; 
    void Start() 
    { 
     worker = new Worker(); 
     worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit); 
     Thread workerThread = new Thread(worker.DoWork); 
     workerThread.Start(); 
    } 
    public void AbnormalExit(object errorArgs) 
    { 
     Start(); 
    } 
} 
class Worker 
{ 
    public AbnormalExitDelegate AbnormalExitCallback; 
    public void DoWork() 
    { 
     try 
     { 
      // do work here 
     } 
     catch (Exception ex) 
     { 
      // pass stuff back, like the exception 
      AbnormalExitCallback(ex); 
     } 
    } 
} 
संबंधित मुद्दे