2011-07-19 8 views
7

अभी, मैं पृष्ठभूमि कार्यकर्ता थ्रेड का उपयोग हर बार कुछ जांचने के लिए कर रहा हूं और यदि शर्तों को पूरा किया जाता है तो संदेशबॉक्स उत्पन्न होता है।एक Winforms एप्लिकेशन में, आप पृष्ठभूमि कार्यकर्ता से संदेशबॉक्स कैसे चला सकते हैं जो हमेशा अग्रभूमि में होना चाहिए?

मुझे थोड़ी देर के लिए नोटिस नहीं हुआ क्योंकि मैं पृष्ठभूमि कार्यकर्ता में संदेशबॉक्स को कॉल कर रहा हूं, इसलिए मैं सामान्य संदेश बॉक्स व्यवहार को खो देता हूं ताकि उपयोगकर्ता मुख्य रूप से वापस क्लिक न करने से पहले हां/नहीं/रद्द कर सकूं संदेश पात्र।

तो, क्या संदेशबॉक्स पर हमेशा कुछ अग्रभूमि में रखने के लिए कुछ विकल्प है? या क्या पृष्ठभूमि कार्यकर्ता से मुख्य रूप में एक संदेश भेजना संभव है ताकि मैं वहां से संदेशबॉक्स उत्पन्न कर सकूं? क्या कोई और तरीका है?

धन्यवाद

इसहाक

उत्तर

9

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

public partial class Form1 : Form 
{ 
    enum states 
    { 
     Message1, 
     Message2 
    } 
    BackgroundWorker worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     worker = new BackgroundWorker(); 
     worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Fake some work, report progress 
     worker.ReportProgress(0, states.Message1); 
    } 

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     states state = (states)e.UserState; 
     if (state == states.Message1) MessageBox.Show("This should hold the form"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     worker.RunWorkerAsync(); 
    } 

} 

नोट: पृष्ठभूमि कार्यकर्ता रिपोर्ट प्रगति पर रोक नहीं पाएगा। यदि आप चाहते हैं कि आपका bgworker mbox दबाए जाने तक प्रतीक्षा करें, तो आपको इसके लिए मैन्युअल रूप से कुछ रोकना होगा।

+0

ओह यह निफ्टी चाल है। मुझे शायद ही इसका उपयोग करके खिड़कियों के नट्स और बोल्ट के बारे में चिंता करने की ज़रूरत है! मैं कल इसे आजमाउंगा। –

2

आप उस फॉर्म के UI थ्रेड को आमंत्रित करने के लिए फॉर्म 1 कक्षा के Invoke विधि का उपयोग कर सकते हैं।

this.Invoke(() => MessageBox.Show("Hi")); 
संबंधित मुद्दे

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