10

मैं निम्नलिखित घटकों के साथ काम कर रहा हूँ:BackgroundWorker अपवाद हैंडलिंग

  • एक पुस्तकालय मेरी लॉगिंग
  • उद्यम पुस्तकालय अपवाद हैंडलिंग आवेदन ब्लॉक का परीक्षण करने के
  • एक परीक्षण-कंसोल (जो एक अपवाद फेंकता है)
  • उद्यम पुस्तकालय प्रवेश आवेदन ब्लॉक

मैं का उपयोग करके पुस्तकालय विधि लागू कर रहा हूँ एक पृष्ठभूमि कार्यकर्ता। पुस्तकालय अपवाद फेंकता है लेकिन RunWorker पूर्ण हैंडलर कभी नहीं कहा जाता है।

अपवाद को पकड़ने का एकमात्र तरीका एक प्रयास/पकड़ ब्लॉक के साथ अपने DoWork हैंडलर कोड को घेरना है।

क्या RunWorkerCompletedEventArgs.Error संपत्ति गलत समझा गया है? क्या यह पृष्ठभूमि अपॉर्कर द्वारा पकड़े गए अपवादों के लिए नहीं है?

Codesample:

static BackgroundWorker w = new BackgroundWorker(); 

w.DoWork += new DoWorkEventHandler(w_DoWork); 
w.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); 
w.RunWorkerAsync(); 



static void w_DoWork(object sender, DoWorkEventArgs e) 
{ 
    MyClass m = new MyClass(); 
    w.result = m.Compute(); 
} 

static void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     HandleException(e.Error); 
    } 

    /* result related code */ 

} 


static void HandleException(Exception e) 
{ 
    ExceptionPolicy.HandleException(e, "MyPolicy"); 
} 

ऊपर नमूना मेरे कंसोल आवेदन की एक समाप्ति की ओर जाता है। बनाम 2010 आउटपुट बिल्कुल कुछ नहीं लिखता (केवल डिफ़ॉल्ट आउटपुट)।

तो समस्या कहां है?

// संपादित करें: यह स्निपेट लाइब्रेरी के अपवाद को पकड़ने के लिए काम करता है।

static void w_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     MyClass m = new MyClass(); 
     w.result = m.Compute(); 
    }catch(Exception e){ } 

} 
+1

क्या आपके पास मुख्य धागे पर कुछ है जो इसे समाप्त होने से रोकता है? थोड़ी देर की तरह कुछ (सच)? – dcarneiro

+0

क्या आप 100% सुनिश्चित हैं कि RunWorker पूर्ण कभी नहीं कहा जाता है? यहां एक SO सवाल है जो साबित करता है कि यह काम करना चाहिए ... http: //stackoverflow.com/questions/1044460/unhandled-exceptions-in-backgroundworker –

+1

क्या आप डीबग नहीं कर सकते और देखें कि क्या होता है? क्या हैंडलएक्सप्शन() रिटर्न? – Reniuz

उत्तर

7

यह पृष्ठभूमिवर्कर के लिए सही पैटर्न है।

मुझे संदेह है कि समस्या यह है कि बीडब्ल्यू पूरा होने से पहले आपकी Main विधि बाहर निकल रही है।

RunWorkerAsync तुरंत वापस आ जाएगी और आप Main में प्रतीक्षा नहीं कर रहे हैं, तो अपनी प्रक्रिया खत्म हो जाएगा, शायद पहले भी BW शुरू कर दिया है, पूरा कोई बात नहीं।

Main विधि के अंत में Console.ReadLine जोड़ने का प्रयास करें।


हित के बाहर:

BW एक कंसोल अनुप्रयोग और एक Windows अनुप्रयोग में अलग ढंग से व्यवहार करता है। यदि आप WinForms या WPF ऐप का उपयोग करते हैं, तो आपके यूआई थ्रेड पर एक व्युत्पन्न सिंक्रनाइज़ेशन कॉन्टेक्स्ट होगा और बीडब्ल्यू यूआई थ्रेड पर 0shमार्शल होगा और इसे वहां चलाएगा। यह बीडब्ल्यू के मुख्य लाभों में से एक है।

एक कंसोल ऐप में, डिफ़ॉल्ट सिंक्रनाइज़ेशन कॉन्टेक्स्ट का उपयोग किया जाता है और यह मार्शल RunWorkerCompleted थ्रेड पूल थ्रेड पर होता है। इसका मतलब है कि आप Main थ्रेड को अवरुद्ध कर सकते हैं और पूरा हैंडलर अभी भी चलाएगा।

+0

आपको बहुत बहुत धन्यवाद :) – csteinmueller

+0

मैंने एक कंसोल ऐप लिया है, क्योंकि यह लाइब्रेरी का परीक्षण करने का सबसे तेज़ तरीका है। मेरे परिणामों को एक WPF एप्लिकेशन में प्रस्तुत करने में मुझे और अधिक समय लगता है। – csteinmueller

+7

@MartinJames मैं अपने समय लिखने वाले कंसोल ऐप्स का एक महत्वपूर्ण हिस्सा खर्च करता हूं जो सर्वर पर निर्धारित और चलाते हैं। एक यूआई ऐसी परिस्थितियों के लिए न तो सहायक और न ही व्यवहार्य होगा। कंसोल ऐप में सरल परीक्षण करना भी कुछ आसान है; कम ओवरहेड बस कुछ आसान करने और परिणामों को देखने के लिए शामिल थे। – Servy

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