2010-11-10 18 views
6

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

उत्तर

2

निम्नलिखित पूर्ण .NET Framework पर लागू होता है, क्योंकि आपका प्रश्न ASP.NET टैग किया गया है। (सिल्वरलाइट में चीजें अलग हो सकती हैं।)

संक्षिप्त उत्तर: यह जटिल है, व्यवहार नेटवर्क प्रदर्शन विशेषताओं सहित विभिन्न चीजों पर निर्भर करता है, इसलिए यह असंगत है और आप इसे आसानी से नियंत्रित नहीं कर सकते हैं।

लांग जवाब:

घटना आम तौर पर हर बार अंतर्निहित WebResponse द्वारा प्रदान की धारा BeginRead आपरेशन कि WebClient अतुल्यकालिक डाउनलोड प्रदर्शन करने के लिए उपयोग करता है के लिए पूरा होने कॉलबैक का आह्वान बढ़ा दी जाएगी।

ऐसा लगता है कि WebClient आमतौर पर 64k हिस्सों में डेटा पढ़ने का प्रयास करेगा। हालांकि, धाराओं के रूप में पूछे जाने वाले आंकड़ों को वापस करने की आवश्यकता नहीं है - यह पूरी तरह से संभव है कि BeginRead पर कॉल करने के लिए अनुरोध 64k से कम होगा। वास्तव में, यह उन नेटवर्कों के लिए काफी आम है जो नेटवर्क से डेटा पढ़ते हैं - वे उपलब्ध होने के तुरंत बाद डेटा की एक छोटी राशि वापस लौटने की संभावना है, सभी 64k आने तक प्रतीक्षा करने की बजाय।

तो सटीक उत्तर इस पर निर्भर करता है प्रश्न में धारा, और नेटवर्क कनेक्शन की प्रकृति और प्रदर्शन पर कुछ हद तक निर्भर हो सकती है।

WebClientWebRequest.Create का उपयोग करता अनुरोध/प्रतिक्रिया कार्यान्वयन है कि अंततः धारा की आपूर्ति करेगा प्राप्त करने के लिए, और कहा कि एक विस्तृत तंत्र है - नेट 5 में निर्मित WebRequest के कार्यान्वयन है और यह एक तानाना तंत्र आप अतिरिक्त संचालकों रजिस्टर देता है कि प्रदान करता है। और यह विशिष्ट WebRequest कार्यान्वयन है जो स्ट्रीम की प्रकृति को निर्धारित करता है।

तो जिस आवृत्ति के साथ आप प्रगति की घटनाएं प्राप्त करते हैं वह पूरी तरह से डाउनलोड के प्रकार तक है - आप किस प्रकार के यूआरएल के आधार पर अलग-अलग परिणाम प्राप्त कर सकते हैं। (उदा।, Http बनाम एफटीपी बनाम फ़ाइल, या जो भी हो।)

मैं एक जंगली अनुमान को खतरे में डाल रहा हूं कि आप HTTP का उपयोग कर रहे हैं।

फिर भी, यह बहुत जटिल है - HttpWebResponse हमेशा उसी प्रकार की स्ट्रीम का उपयोग नहीं करता है। उदाहरण के लिए, यह कभी कभी एक धारा MemoryStream से प्राप्त लौट सकते हैं, कभी कभी यह प्रकार ConnectStream की है ...

तो आप किसी भी निश्चितता क्या आकार विखंडू अंतर्निहित धारा लौटने की संभावना है के साथ नहीं कह सकते क्योंकि आप भी नहीं कर सकते हैं सुनिश्चित करें कि आपको किस प्रकार की स्ट्रीम मिल सकती है।

चाहे आप इसे नियंत्रित कर सकें, एकमात्र तरीका है कि आप कस्टम यूआरएल योजना के लिए कस्टम WebRequest कार्यान्वयन प्रदान कर सकते हैं। लेकिन स्पष्ट रूप से, यह कोड लिखने के लिए शायद सरल है जो घटनाओं की आवृत्ति को बदलने की कोशिश करने के बजाए किसी भी विशेष घटना के साथ कुछ भी करने का निर्णय लेता है या नहीं।

0

वैसे मेरे परीक्षण यह सुझाव देते हैं कि यह काफी हद तक अनिश्चित है।

यह घटना 828 बाइट से कम कभी नहीं बढ़ती है और ऐसा लगता है कि यह 65536 बाइट से अधिक नहीं है।

मैं एमएसडीएन से किसी भी विनिर्देश को खोदने में असमर्थ रहा हूं। उनका विवरण:

"यह घटना हर बार असीमित डाउनलोड प्रगति करता है। इस घटना को जब डाउनलोड निम्नलिखित से किसी भी विधि का उपयोग शुरू कर रहे हैं इस प्रकार उठाया है "

कोड का प्रयोग किया:।

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim client As New WebClient 

     AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompleted 
     AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressCallback 

     Dim uri As New Uri("http://ftp.iinet.net.au/test500MB.dat", UriKind.Absolute) 

     client.DownloadFileAsync(uri, "test500MB.dat") 
End Sub 

Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) 

     Debug.Print("{0} downloaded {1} of {2} bytes. {3} % complete... Difference: {4}", _ 
     CStr(e.UserState), e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage, CLng(e.BytesReceived - m_LastValue)) 

     m_LastValue = e.BytesReceived 
End Sub 

आउटपुट:

downloaded 27416820 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27482356 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27483184 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27548720 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27550960 of 500000000 bytes. 5 % complete... Difference: 2240 
    downloaded 27586260 of 500000000 bytes. 5 % complete... Difference: 35300 
    downloaded 27651796 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27652624 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27718160 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27718988 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27755700 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27821236 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27822064 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27887600 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27888428 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 27925140 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 27990676 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 27991504 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28057040 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28057868 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28094580 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 28160116 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28160944 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28226480 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28227308 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28264020 of 500000000 bytes. 5 % complete... Difference: 36712 
    downloaded 28329556 of 500000000 bytes. 5 % complete... Difference: 65536 
    downloaded 28330384 of 500000000 bytes. 5 % complete... Difference: 828 
    downloaded 28395920 of 500000000 bytes. 5 % complete... Difference: 65536 

10 एमबी फ़ाइल आउटपुट इसमें परिवर्तन:

downloaded 307533 of 10000000 bytes. 3 % complete... Difference: 28240 
    downloaded 369661 of 10000000 bytes. 3 % complete... Difference: 62128 
    downloaded 431789 of 10000000 bytes. 4 % complete... Difference: 62128 
    downloaded 497325 of 10000000 bytes. 4 % complete... Difference: 65536 
    downloaded 498153 of 10000000 bytes. 4 % complete... Difference: 828 
    downloaded 553221 of 10000000 bytes. 5 % complete... Difference: 55068 
    downloaded 618757 of 10000000 bytes. 6 % complete... Difference: 65536 
    downloaded 619585 of 10000000 bytes. 6 % complete... Difference: 828 
    downloaded 649237 of 10000000 bytes. 6 % complete... Difference: 29652 
    downloaded 714773 of 10000000 bytes. 7 % complete... Difference: 65536 
    downloaded 715601 of 10000000 bytes. 7 % complete... Difference: 828 
    downloaded 748077 of 10000000 bytes. 7 % complete... Difference: 32476 
    downloaded 813613 of 10000000 bytes. 8 % complete... Difference: 65536 
    downloaded 814441 of 10000000 bytes. 8 % complete... Difference: 828 
    downloaded 866685 of 10000000 bytes. 8 % complete... Difference: 52244 
    downloaded 932221 of 10000000 bytes. 9 % complete... Difference: 65536 
    downloaded 933049 of 10000000 bytes. 9 % complete... Difference: 828 
    downloaded 982469 of 10000000 bytes. 9 % complete... Difference: 49420 
    downloaded 1048005 of 10000000 bytes. 10 % complete... Difference: 65536 
    downloaded 1048833 of 10000000 bytes. 10 % complete... Difference: 828 
    downloaded 1114369 of 10000000 bytes. 11 % complete... Difference: 65536 
    downloaded 1115197 of 10000000 bytes. 11 % complete... Difference: 828 
+0

पीएस: बस ध्यान दिया कि यह एक सी # प्रश्न था ... वीबी कोड के लिए मुझे मत मारो :-) –

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