2013-11-01 7 views
5

सब, WinForm में एकाधिक थ्रेड केस को संभालने के लिए मुझे पहले से ही BackgroundWorker का मूल उपयोग पता था। और कोड संरचना नीचे की तरह दिखती है।BackgroundWorker ईवेंट का उपयोग कैसे करें RunWorkerCompleted

आवेदन के मुख्य धागे में। बस पृष्ठभूमि वर्क शुरू करें।

if (backgroundWorker1.IsBusy != true) 
    { 
     // Start the asynchronous operation. 
     backgroundWorker1.RunWorkerAsync(); 
    } 

तो यह DoWork घटना निकाल देते थे। तो हम वहां कुछ कर सकते हैं।

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    ...... 
    // report progress. 
    worker.ReportProgress(iProgress); 
    .... 
} 

फिर हम सिर्फ BackgroundWorker प्रगति दिखाने के लिए ProgressChanged घटना को संभालने के लिए की जरूरत है।

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //show progress. 
    resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); 
} 

DoWork समाप्त होने के बाद या कुछ अपवाद हुआ। घटना RunWorkerCompleted निकाल दिया जाएगा।

यहां इन घटनाओं के संचालन के लिए मेरे प्रश्न आते हैं। कृपया उनकी समीक्षा करने में मदद करें। धन्यवाद।

मैंने देखा कि RunWorkerCompletedEventArgs e में 'परिणाम' नाम की संपत्ति है, इसका उपयोग क्या होता है? मुझे इसे कैसे प्रयोग में लाना है ?

क्या e.error के बजाय मेरा कस्टम अपवाद संदेश प्राप्त करने की कोई संभावना है? यदि वहाँ है, तो इसे कैसे बनाया जाए?

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled == true) 
    { 
     resultLabel.Text = "Canceled!"; 
    } 
    else if (e.Error != null) 
    { 
     resultLabel.Text = "Error: " + e.Error.Message; 
    } 
    else 
    { 
     resultLabel.Text = e.Result.ToString(); 
    } 
} 

उत्तर

13

RunWorkerCompletedEventArgs में Result संपत्ति के मूल्य आप DoWork() में DoWorkEventHandler का परिणाम प्रॉपर्टी को निर्दिष्ट किया गया है।

आप, तो आप इस चाहते कुछ भी प्रदान कर सकते हैं ताकि आप एक पूर्णांक, एक स्ट्रिंग, एक वस्तु/संयुक्त प्रकार, आदि

लौट सकते हैं एक अपवाद DoWork() में फेंक दिया जाता है, तो आप में अपवाद उपयोग कर सकते हैं ErrorRunWorkerCompletedEventArgs की संपत्ति। इस स्थिति में, परिणाम संपत्ति तक पहुंचने से TargetInvocationException फेंक दिया जाएगा।

+0

के बारे में क्या 'Error' का उपयोग करें? ओपी ने यही पूछा। –

+1

अद्यतन उत्तर। धन्यवाद। (फोन पर पढ़ना और इसे याद किया) – SimonGoldstone

0

आप DoWork से किसी भी परिणाम को स्टोर करने के लिए परिणाम संपत्ति का उपयोग कर सकते हैं और इसे पूर्ण ईवेंट से एक्सेस कर सकते हैं। लेकिन अगर पृष्ठभूमि कार्यकर्ता की प्रक्रिया रद्द हो गई है या अपवाद उठाया गया है, तो परिणाम पहुंच योग्य नहीं होगा। आपको अधिक जानकारी मिलेगी here

5
public class MyWorkerClass 
{ 
    private string _errorMessage = ""; 
    public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; }} 

    public void RunStuff(object sender, DoWorkEventArgs e) 
    { 
     //... put some code here and fill ErrorMessage whenever you want 
    } 
} 

तो वर्ग जहां आप इसे

public class MyClassUsingWorker 
{ 
    // have reference to the class where the worker will be running 
    private MyWorkerClass mwc = null; 

    // run the worker 
    public void RunMyWorker() 
    { 
     mwc = new MyWorkerClass(); 
     BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 
     backgroundWorker1.DoWork += new DoWorkEventHandler(mwc.RunStuff); 
     backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     string strSpecialMessage = mwc.ErrorMessage; 

     if (e.Cancelled == true) 
     { 
      resultLabel.Text = "Canceled!"; 
     } 
     else if (e.Error != null) 
     { 
      resultLabel.Text = "Error: " + e.Error.Message; 
     } 
     else 
     { 
      resultLabel.Text = e.Result.ToString(); 
     } 
    } 
} 
संबंधित मुद्दे