2009-07-22 16 views
5

मेरे पास एक ऐसा फॉर्म है जो थ्रेड शुरू करता है। अब जब मैं इस थ्रेड को समाप्त करता हूं तो फॉर्म को स्वतः बंद करना चाहता हूं।थ्रेड समाप्त होने पर विधि को कॉल करना

अब तक का एकमात्र समाधान मैंने पाया है कि फॉर्म में टाइमर जोड़ रहा है और जांचें कि प्रत्येक टिक पर धागा जीवित है या नहीं। लेकिन मैं जानना चाहता हूं कि ऐसा करने का कोई बेहतर तरीका है या नहीं?

वर्तमान में मेरे कोड दिखता है इस

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

उत्तर

10

BackgroundWorker वर्ग धागा प्रबंधन की इस तरह के लिए मौजूद है आप अपने खुद के रोल करने के लिए बचाने के लिए की तरह अधिक कम; यह एक RunWorker पूर्ण घटना प्रदान करता है जिसे आप बस सुन सकते हैं।

+0

काम करता है महान, धन्यवाद – RaYell

6

इसे एक सहायक विधि कॉल करने के लिए संपादित करें ताकि यह क्लीनर हो।

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

यह काम नहीं करता है, तो उपरोक्त विधियों मापदंडों और एक से अधिक थ्रेड है। सिंक (param1) 30 सेकंड लेता है, और जब यह OnWorkComplete निष्पादित करता है तो मेरे पास वर्तमान param1 पर paramx है और मुझे गलत परिणाम मिलते हैं :( – Sakthivel

+0

यदि आपके पास लिंक नहीं है तो यह भी काम नहीं करता है ... –

6

आप एक BackgroundWorker पर एक नजर है, तो उसके लिए RunWorkerCompleted घटना जब कार्यकर्ता पूरा करता है कहा जाता है कि है।

BackgroundWorkers Click Here

या

आप एक बार यह समाप्त हो गया है थ्रेड से एक पूर्ण फ़ंक्शन की कॉल जोड़ सकता है, और यह आह्वान पर अधिक जानकारी के लिए

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

प्रतिनिधियों पर एक नज़र डालें, IAsyncResult, BeginInvoke और AsyncCallback

1

अपने धागा विधि के अंत में, आप बंद (कॉल कर सकते हैं) आह्वान() विधि (का उपयोग करते हुए, क्योंकि अधिकांश WinForms तरीकों बुलाया जाना चाहिए यूआई धागे से):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
} 
संबंधित मुद्दे