2011-02-12 13 views
6

मैं वेब क्लाइंट ऑब्जेक्ट के DownloadDataAsync विधि का उपयोग करके इंटरनेट से एक फ़ाइल डाउनलोड करने की कोशिश कर रहा हूं C# ।सी # वेब क्लाइंट डाउनलोड प्रोग्रेस चेंज सही ढंग से काम नहीं करेगा

मैं वेब क्लाइंट ऑब्जेक्ट की DownloadProgressChanged ईवेंट का उपयोग करके डाउनलोडिंग प्रगति भी प्राप्त करना चाहता हूं।

समस्या यह है कि न तो बाइट्स प्राप्त और न ही कुलबाइट्स ट्राइसेव गुण सही मान दिखा रहे हैं। जब मैं डिबगिंग करते समय उन्हें जांचने की कोशिश करता हूं तो वे दोनों एक अपरिवर्तनीय तरीके से बदल रहे हैं।

मेरे कोड:

WebClient client = new WebClient(); 
     client.BaseAddress = this.DownloadUrl; 
     client.DownloadProgressChanged += downloadProgressDelegate; 
     client.DownloadDataAsync(new System.Uri(this.DownloadUrl)); 
+1

आप कौन सी फाइल डाउनलोड कर रहे हैं? क्या आप बैंडविड्थ सीमित के साथ अपने स्थानीय आईआईएस से बड़ी फाइल को आजमा सकते हैं ताकि एक पुन: उत्पन्न परीक्षण वातावरण प्रदान किया जा सके? –

उत्तर

5

मैं सिर्फ LINQPad में निम्न कोड की कोशिश की:

var uri = @"http://download.services.openoffice.org/files/stable/3.3.0/OOo_3.3.0_Win_x86_install-wJRE_en-US.exe"; 

WebClient client = new WebClient(); 
client.DownloadProgressChanged += (sender, e) => 
    { 
    Console.WriteLine("Bytes: " + e.BytesReceived + " of " + e.TotalBytesToReceive); 
    }; 

client.DownloadDataAsync(new System.Uri(uri)); 

Thread.Sleep(4000); 
client.CancelAsync(); 

... और निम्नलिखित परिणाम मिला:

 
Bytes: 4138 of 158067944 
Bytes: 50858 of 158067944 
Bytes: 68378 of 158067944 
Bytes: 134078 of 158067944 
Bytes: 133914 of 158067944 
..... 

काम करने के लिए लगता है।

संपादित करें: हो सकता है कि आपके HTTP सर्वर सही ढंग से return the size नहीं करता है, लेकिन मैं WebClient कार्यान्वयन के खिलाफ इस सर्वर व्यवहार का परीक्षण करने के लिए एक यूआरआई नहीं है।

+0

क्या यह फ़ाइल डाउनलोड करने पर निर्भर हो सकता है? –

1

सही होने के बाद DownloadDataAsync कोशिश इसी तरह की समस्याओं था,:

while (client.IsBusy) { Application.DoEvents(); } 
0

आप बस "का इंतजार है" यह चाहिए। यानी .:

await client.DownloadDataAsync(new System.Uri(uri)); 

कृपया मत भूलना एक "async कार्य" में अपने विधि परिवर्तित करने के लिए, कार्य या async शून्य async। अन्यथा अगर आप अपने विधि signiture में परिवर्तन करने के लिए नहीं करना चाहते हैं तो आप निम्न भी कर सकते हैं:

client.DownloadDataAsync(new System.Uri(uri)).Wait(); 

उपरोक्त दोनों दृष्टिकोण फायदे और नुकसान हैं और यह आप पर निर्भर है जो उन में से एक लेने के लिए है।

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