जैसा कि मार्क ने कहा था, आप यह सुनिश्चित करना चाहते हैं कि आप अपने लंबे चलने वाले गणना करने के लिए एक नया धागा स्पिन करें। इस तरह यूजर इंटरफेस थ्रेड (जो कि सभी स्क्रीन अपडेट करना है) जब भी आप प्रतिशत को पूरा करते हैं तो प्रोग्रेस बार को फिर से चला सकते हैं।
यह ध्यान रखना महत्वपूर्ण है कि केवल UI थ्रेड इंटरफ़ेस अपडेट कर सकता है। इसलिए, एक बार जब आप एक अलग थ्रेड पर चल रहे हों, तो आपको यह सुनिश्चित करने के लिए एक अतिरिक्त उछाल से गुजरना होगा कि यूआई थ्रेड पर आपका यूआई परिवर्तन संसाधित हो। यदि आप सुनिश्चित नहीं हैं कि आप किस थ्रेड पर चल रहे हैं, तो आप UIoke थ्रेड में वास्तविक हैं या नहीं, यह देखने के लिए आप InvokeRequired (यदि आपकी कक्षा एक System.Windows.Form है) का मान देख सकते हैं।
यूआई थ्रेड पर संसाधित करने के लिए अपने आदेश को प्राप्त करने के लिए, Control.Invoke() फ़ंक्शन का उपयोग यह सुनिश्चित करने के लिए करें कि आपके द्वारा काम कर रहे नियंत्रण के लिए यूआई थ्रेड पर अपडेट संसाधित हो।
नीचे मेरे नमूना कोड में मैं एक प्रतिनिधि समारोह प्रकार बना रहा हूं और पहले से ही आवंटित फ़ंक्शन घोषित कर रहा हूं .... मैंने इसे किसी भी शांत सी # 3.5 कार्यों के साथ नहीं किया है, लेकिन मुझे लगता है कि आप काम कर सकते हैं एक ही काम करने के लिए एक लम्बा अभिव्यक्ति।
private void bCreateInvoices_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(CreateInvoices);
worker.RunWorkerAsync(this);
}
// Here is the long running function that needs to update the progress bar
public void CreateInvoices(object sernder, DoWorkEventArgs e)
{
int totalChecked = CountCheckedServiceOrders();
int totalCompleted = 0;
foreach (...data to process...) {
totalCompleted++;
if (InvokeRequired) {
Invoke(new Change(OnChange), "status text",
totalCompleted, totalChecked);
}
}
}
// this code updates the status while a background thread works
private delegate void Change(string status, int complete, int total);
private void OnChange(string status, int complete, int total)
{
if (status == null) {
progressBar.Visible = false;
lStatus.Text = "Task complete";
progressBar.Value = 0;
} else {
progressBar.Visible = true;
progressBar.Minimum = 0;
progressBar.Maximum = total;
progressBar.Value = complete;
lStatus.Text = status;
}
}
MSDN Control.InvokeRequired manual page और कुछ अधिक जानकारी के लिए MSDN Control.Invoke manual page पर एक नजर डालें।
स्रोत
2009-07-01 12:13:18
के लिए धन्यवाद के बारे में मैं सी # पर्याप्त यहाँ जवाब देने के लिए पता नहीं है, लेकिन जावा में यह एक अलग थ्रेड की जरूरत है या फिर आप इस समान व्यवहार हो जाएगा स्विंग। – Chet