2012-02-27 8 views
14

के साथ असीमित फ़ाइल डाउनलोड करें WebClient प्रगति परिवर्तन डाउनलोड करने के रूप में प्रगति बार की प्रगति परिवर्तन करने का प्रयास कर रहा हूं। यह कोड तब भी फ़ाइल डाउनलोड करता है जब मैं startDownload() पर कॉल करता हूं, क्योंकि विंडो फ़ाइल को डाउनलोड करता है। मैं चाहता हूं कि उपयोगकर्ता स्प्लैश स्क्रीन लोड के रूप में प्रगति परिवर्तन को देखने में सक्षम हो। क्या इसे ठीक करने का कोई तरीका है ताकि उपयोगकर्ता progressBar2 परिवर्तन की प्रगति देख सके?प्रगति बार

private void startDownload() 
{ 
    WebClient client = new WebClient(); 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
    client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); 
    client.DownloadFileAsync(new Uri("http://joshua-ferrara.com/luahelper/lua.syn"), @"C:\LUAHelper\Syntax Files\lua.syn"); 
} 
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    double bytesIn = double.Parse(e.BytesReceived.ToString()); 
    double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
    double percentage = bytesIn/totalBytes * 100; 
    label2.Text = "Downloaded " + e.BytesReceived + " of " + e.TotalBytesToReceive; 
    progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString()); 
} 
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    label2.Text = "Completed"; 
} 
+0

यदि खिड़की फ्रीज करता है तो इसका मतलब है कि व्यक्ति यूआई थ्रेड पर डाउनलोड कर रहा है जो आपके कोड को तुल्यकालिक और अतुल्यकालिक नहीं करता है। – Joakim

+0

मैं एक पृष्ठभूमि कार्यकर्ता के माध्यम से अतुल्यकालिक चल रहा है 'startDownload() 'को कॉल कर रहा हूं। हालांकि खिड़की को फ्रीज नहीं करना चाहिए, है ना? –

+6

कृपया अपने शीर्षक को "सी #" और इस तरह से उपसर्ग न करें। टैग के लिए यही है। –

उत्तर

9

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

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

+0

धन्यवाद, मुझे एहसास नहीं हुआ कि मैं किसी अन्य एसिंक थ्रेड के माध्यम से डाउनलोड शुरू नहीं कर पाऊंगा। सब ठीक काम कर रहे हैं। –

1

मेरा मानना ​​है कि यह लेख आपको सही दिशा में http://www.dreamincode.net/forums/topic/115491-download-file-asynchronously-with-progressbar/ पर ले जाएगा।

और इस एमएसडीएन आलेख में http://msdn.microsoft.com/en-us/library/ms229675.aspx चर्चा करता है कि कैसे "पृष्ठभूमिवर्कर घटक के कार्यकर्ता थ्रेड पर फ़ाइल डाउनलोड की जाती है, जो DoWork ईवेंट हैंडलर चलाती है। यह थ्रेड तब शुरू होता है जब आपका कोड RunWorkerAsync विधि को कॉल करता है।"

+0

मैंने पहले से ही उस लेख का पालन किया है जिसने एक ही समस्या का नेतृत्व किया। –

+2

क्या आप पृष्ठभूमि थ्रेड से डाउनलोड प्रगति दिखाने के लिए अपने फ़ंक्शन का उपयोग कर रहे हैं? यदि ऐसा है, तो आपको इसे यूआई थ्रेड में शुरू करना चाहिए, लेकिन पृष्ठभूमि कार्यकर्ता के प्रगति फ़ंक्शन को हुक करना चाहिए। मुझे उम्मीद है कि कुछ मदद की जा सकती है। मैं अभी भी आपके द्वारा की जा रही परेशानी से संबंधित कुछ पढ़ रहा हूं इसलिए उम्मीद है कि मैं एक और समाधान के साथ आ सकता हूं। – SMT

18

यूआई थ्रेड फ्रीज किया जाएगा जब आप स्टार्टडाउनलोड() पर क्लिक करेंगे। यदि आप फॉर्म को फ्रीज नहीं करना चाहते हैं, तो आप स्टार्टडाउनलोड() किसी अन्य थ्रेड में उपयोग करें और क्रॉस-थ्रेडेड में प्रगति अद्यतन करें। एक तरह से,

private void startDownload() 
{ 
    Thread thread = new Thread(() => { 
      WebClient client = new WebClient(); 
      client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
      client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); 
      client.DownloadFileAsync(new Uri("http://joshua-ferrara.com/luahelper/lua.syn"), @"C:\LUAHelper\Syntax Files\lua.syn"); 
    }); 
    thread.Start(); 
} 
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    this.BeginInvoke((MethodInvoker) delegate { 
     double bytesIn = double.Parse(e.BytesReceived.ToString()); 
     double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); 
     double percentage = bytesIn/totalBytes * 100; 
     label2.Text = "Downloaded " + e.BytesReceived + " of " + e.TotalBytesToReceive; 
     progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString()); 
    }); 
} 
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    this.BeginInvoke((MethodInvoker) delegate { 
     label2.Text = "Completed"; 
    }); 
} 

इस http://msdn.microsoft.com/en-us/library/ms951089.aspx

-Fixed पास लापता) की तरह गूगल में अधिक बहु सूत्रण पढ़ें; बीजी थ्रेड घोषणा

+0

MethodInvoker मेरे प्रोग्राम में नहीं आ रहा है मुझे क्या करना चाहिए –

+1

BeginInvoke WinForms नामस्थान में है। यदि आप WPF का उपयोग कर रहे हैं तो आपको Dispatcher.BeginInvoke – Tsukasa

+0

फ़ाइलों को डाउनलोड करने के लिए उपरोक्त कोड का उपयोग करना चाहिए, लेकिन मैं दूरस्थ सर्वर त्रुटि को कनेक्ट करने में असमर्थ हूं। –