2011-04-05 10 views
7

यह मेरी कक्षा से एक स्निपेट है:सी # .net - प्रोग्राम को कैसे अलर्ट करना है कि थ्रेड समाप्त हो गया है (ईवेंट संचालित)?

public bool start() 
{ 
    Thread startThread = new Thread(this.ThreadDealer); 
    startThread.Start(); 
    return _start; 
} 

थ्रेडडिएलर में() मैं बूलियन वैरिएबल "_start" को गलत या सत्य में सेट कर रहा हूं। मुझे अब क्या चाहिए, लेकिन यह पता लगाना प्रतीत नहीं होता है कि थ्रेड डीलर() - थ्रेड समाप्त होने पर अपने रिटर्न स्टेटमेंट को निष्पादित करने के लिए प्रारंभ() को चेतावनी देने के लिए एक ईवेंट है।

मैंने ऑटोरेटेवेंट और .WaitOne() के साथ कुछ करने की कोशिश की लेकिन चूंकि मेरे पास एक जीयूआई है जो सिर्फ सब कुछ अवरुद्ध करता है और जब ऐसा करता है तो मुझे ऐसा करने की ज़रूरत होती है (थ्रेड खत्म होने की प्रतीक्षा करें) यह बेकार है अगर यह मेरे ब्लॉक को ब्लॉक करता है जीयूआई।

किसी भी मदद की बहुत सराहना की जाएगी।

उत्तर

6

बस एक ईवेंट उठाएं। यह गलत धागे पर चलेगा, इसलिए किसी भी यूआई को अपडेट करने के लिए यदि आवश्यक हो तो कॉल को मार्शल करके जो भी ईवेंट हैंडलर को इससे निपटना होगा। आप जिस क्लास लाइब्रेरी का उपयोग करते हैं उसके आधार पर Control.Begin/Invoke या Dispatcher.Begin/Invoke का उपयोग करके।

या पृष्ठभूमिवर्कर वर्ग का उपयोग करें, यह स्वचालित रूप से करता है।

24

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

BackgroundWorker class का उपयोग करने का सबसे आसान तरीका है। यह काम पूरा होने के बाद यूआई थ्रेड (RunWorkerCompleted) में एक कार्यक्रम उठाता है। यहां एक उदाहरण दिया गया है:

public void start() 
{ 
    var bw = new BackgroundWorker(); 

    // define the event handlers 
    bw.DoWork += (sender, args) => { 
     // do your lengthy stuff here -- this will happen in a separate thread 
     ... 
    }; 
    bw.RunWorkerCompleted += (sender, args) => { 
     if (args.Error != null) // if an exception occurred during DoWork, 
      MessageBox.Show(args.Error.ToString()); // do your error handling here 

     // Do whatever else you want to do after the work completed. 
     // This happens in the main UI thread. 
     ... 
    }; 

    bw.RunWorkerAsync(); // starts the background worker 

    // execution continues here in parallel to the background worker 
} 
संबंधित मुद्दे