2010-07-20 11 views
12

मेरा विनफॉर्म एक कक्षा को कॉल करता है जो कुछ प्रतिलिपि क्रियाएं करता है। मैं इसे एक रूप में प्रगति दिखाना चाहता हूं।कक्षा के भीतर से पृष्ठभूमि वर्कर में प्रगति की रिपोर्ट कैसे करें?

मैं BackgroundWorker उपयोग करना चाहते हैं, लेकिन मैं कैसे प्रपत्र (/ BackgroundWorker) करने के लिए कक्षा से प्रगति रिपोर्ट करने के लिए

उत्तर

14

प्रगति की रिपोर्ट करने के लिए BackgroundWorker कीविधि का उपयोग करें और अपने GUI में प्रगति को अपडेट करने के लिए BackgroundWorker के ProgessChangedEvent की सदस्यता लें।

आपकी प्रति वर्ग BackgroundWorker जानता है और ProgressChanged की सदस्यता लेती है। यह पृष्ठभूमि कार्यकर्ता के ProgressChanged ईवेंट के लिए ईवेंट हैंडलर द्वारा उठाए गए ProgressChanged ईवेंट का भी खुलासा करता है। अंत में आपकी Form कॉपी क्लास की ProgressChanged ईवेंट की सदस्यता लेती है और प्रगति प्रदर्शित करती है।

कोड:

public class CopySomethingAsync 
{ 
    private BackgroundWorker _BackgroundWorker; 
    public event ProgressChangedEventHandler ProgressChanged; 

    public CopySomethingAsync() 
    { 
     // [...] create background worker, subscribe DoWork and RunWorkerCompleted 
     _BackgroundWorker.ProgressChanged += HandleProgressChanged; 
    } 

    private void HandleProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     if (ProgressChanged != null) 
      ProgressChanged.Invoke(this, e); 
    } 
} 

अपने प्रपत्र में सिर्फ CopySomethingAsync की ProgressChanged घटना की सदस्यता और प्रगति प्रदर्शित करते हैं।

+0

आप प्रोग्रेस चेंज किए गए ईवेंट को फॉर्म में कैसे बेनकाब करेंगे? – Martijn

+0

मैंने अभी यह दिखाने के लिए अपना जवाब अपडेट किया है। – andyp

+0

यह एक अद्भुत और बिल्कुल सहायक उत्तर है, बहुत बहुत धन्यवाद! –

8

सब कुछ आप को पता है के बारे में BackgroundWorker msdn पर है की जरूरत है पता नहीं है।

यह लेख में कहते हैं:

, प्रगति अद्यतन की सूचनाएं प्राप्त ProgressChanged घटना को संभालने के लिए।


अद्यतन:

:

Martijn के पूरक प्रश्नों को पढ़ने के बाद, और यह देखते हुए कि वह एक वर्ग जो अब तक, अपने काम कर रहा है शायद अग्रभूमि धागे पर है, मैं निम्नलिखित जोड़ना होगा

  • कार्यकर्ता वर्ग के काम की ज़िम्मेदारी है, इसलिए इसकी प्रगति पर रिपोर्टिंग की जिम्मेदारी भी है। तथ्य यह है कि यह काम करने के लिए पृष्ठभूमि धागे को जन्म देता है, यह फ़ॉर्म की चिंता नहीं है।

  • तो, मैं कक्षा को बीजीडब्लू सेट अप करने के इच्छुक हूं, और इसकी प्रोग्रेस चेंजेड घटनाओं को संभालने के इच्छुक हूं, और फिर अपनी घटनाओं (अग्रभूमि धागे पर) बढ़ाएं, जिस पर फॉर्म स्वयं सदस्यता ले सकता है। मैं इस तकनीक का उपयोग कर WinForms कोडिंग का एक टन करता हूं और यह ठीक काम करता है।

विकल्प कार्यकर्ता वर्ग के एक सार्वजनिक संपत्ति के रूप BGW का पर्दाफाश, और प्रपत्र अपने घटनाओं को प्रत्यक्ष रूप से संभाल करने के लिए किया जाएगा। लेकिन मुझे यह बहुत पसंद नहीं है, क्योंकि यह कार्यकर्ता वर्ग के कार्यान्वयन पर निर्भर करता है। यह आम तौर पर एक बुरी चीज है।

+0

तो मैं में एक सार्वजनिक पृष्ठभूमि संपत्ति जोड़ने के लिए मेरी कक्षा और फॉर्म को प्रगतिशील घटना में पंजीकरण करना है? – Martijn

2

यह आपके वर्तमान BackgroundWorker ऑब्जेक्ट की ReportProgress इंस्टेंस विधि के माध्यम से किया जाता है। आपके फॉर्म को ProgressChanged ईवेंट की सदस्यता लेनी होगी।

MSDN एक छोटा सा उदाहरण यहाँ है: एक रूप हैंडलर पर अपनी कक्षा

backgroundWorker.ReportProgress(i++); 

में http://msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx

+0

मेरा फॉर्म प्रोग्रेस चेंजेड इवेंट में खुद को कैसे सब्सक्राइब करता है? – Martijn

+0

'backgroundWorker1.ProgressChanged + = नई प्रगतिChangedEventHandler (backgroundWorker1_ProgressChanged); 'जहां' पृष्ठभूमि वर्कर 1_ProgressChanged' आपके ईवेंट हैंडलिंग विधि का नाम है, जो प्रतिनिधि 'प्रोग्रेस चेंजएंडहैंडलर' द्वारा प्रोटोटाइप किया गया है। – Andreas

+0

मुझे यह नहीं मिला, क्षमा करें। मैं अभी भी नहीं देखता कि मेरा फॉर्म 'प्रोग्रेस चेंजेड' ईवेंट में कैसे पंजीकरण कर सकता है। आपके मामले में एक विधि है ('backgroundWorker1_ProgressChanged') जो ईवेंट को संभालती है। लेकिन मेरे फॉर्म को घटना को संभालने की जरूरत है, न कि मेरी कक्षा .. – Martijn

1

कॉल एक घटना

//declare progressBar1 in the form and set range 
// progressBar1.Minimum = 0; 
//progressBar1.Maximum = 100; 
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     //show progress bar 

    } 
+0

इस मामले में, मैं अपनी कक्षा में प्रोग्रेस चेंज किए गए ईवेंट का खुलासा कैसे करूं? – Martijn

+0

मैं आपकी कक्षा को केवल एक घटना देता हूं जो तब भी उठाया जाता है जब पृष्ठभूमिवर्कर की प्रोग्रेस चेंज की गई घटना को उठाया जाता है। आपके ईवेंट में पृष्ठभूमिवर्कर के समान हस्ताक्षर होंगे। – andyp

+0

आपको पारित 'प्रगतिChangedEventArgs'' के 'प्रोग्रेसपेरसेटेज' उदाहरण फ़ील्ड से 'ReportProgress' को पास किया गया मान, यानी 'progressBar1.Value = e.PogressPercentage;'। – Andreas

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