2010-06-04 17 views
7

मैं एक सर्वर से कुछ फ़ाइलों को डाउनलोड करने के लिए WebClient की DownloadFileAsync विधि का उपयोग कर रहा है, और मैं मदद नहीं कर सकता लेकिन लगता है कि VS2010 भीतर मेरे कोड की मेरी अनौपचारिक परीक्षण में, इसके बारे में 3 सेकंड के लिए ब्लॉक, जबकि यह शुरू होता है, जो, मेरी राय में इस तरह के उद्देश्य को पहले स्थान पर हराया जाता है।WebClient.DownloadFileAsync वास्तव में इस धीमी गति से है?

WebClient downloader = new WebClient(); 
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(updateDownloadProgress); 
downloader.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadCompleted); 

var current_map = map_downloads[0];//string with filename, map_downloads is List<string> 

var path = System.IO.Path.GetTempFileName(); 

downloaded_maps.Add(path);//adding the temp file to a List<string> 

downloader.DownloadFileAsync(new Uri(MAP_BASE + current_map), path); //MAP_BASE is a string containing the base url 

मैं DownloadFileAsync उपयोग कर रहा हूँ को अवरुद्ध करने से यूआई रखने के लिए, जबकि आवेदन एक ~ 100 एमबी फ़ाइल डाउनलोड करता है:

यहाँ कोड के प्रासंगिक टुकड़ा है। जाहिर है अगर 3 सेकंड के लिए यूआई ब्लॉक, जबकि कॉल शुरू होता है, कि कुछ हद तक उपयोगिता कम हो, अगर पूरी तरह से नहीं।

मैं सी #/नेट के साथ तुलनात्मक रूप से अनुभवहीन हूं (मैंने 3-4 साल पहले आईईटी 2.0 सामान का एक समूह किया था, आईआईआरसी, लेकिन मैं मूल रूप से इसे अभी जारी कर रहा हूं)।

उत्तर

0

आप पता लगा है, तो देरी अपने अनुप्रयोग में है, या नेटवर्क पर है? यह पता लगाने के लिए कि क्या गंतव्य सर्वर धीमा है, Wireshark चलाएं और देखें कि अनुरोध भेजने के बाद पहली प्रतिक्रिया कब प्राप्त होती है। हो सकता है कि देरी हो?

इसके अलावा, अगर यह एक बड़ा आवेदन का हिस्सा है, तो पहली बार हमेशा स्टार्टअप लागत की वजह से धीमी गति से किया जाएगा। आप वास्तव में एक अच्छा माप प्राप्त करना चाहते हैं, कुल समय 1 मंगलाचरण के लिए आवश्यक को मापने, और 10 वीं मंगलाचरण के माध्यम से 2 के लिए। इससे आप यह पता लगा सकते हैं कि देरी स्टार्टअप लागत में है या हर बार।

7

मैंने कहीं पढ़ा है कि DownloadFileAsync वास्तव में अवरुद्ध धागे में DNS नाम की जांच करता है, इसलिए आपको मंदी क्यों मिल रही है। यदि आप सीधे आईपी डालते हैं, तो कोई अवरोध नहीं होना चाहिए। जानकारी के उस टुकड़े मिली: http://www.csharp-examples.net/download-files/

8

क्या एनएवी का कहना है के अलावा, यह लग रहा है समस्या की तरह वेब प्रॉक्सी autodetection है, इस सवाल का जवाब देखें: Why is this WebRequest code slow?

मैं इसे परीक्षण किया है और यह अब किसी भी महत्वपूर्ण बिना काम करता है पहली कॉल के दौरान देरी।

+0

धन्यवाद, कि पूरी तरह से काम किया! एक ही समस्या का सामना करने वाले लोगों के लिए, बस डाउनलोड करने से पहले वेब क्लाइंट की 'प्रॉक्सी' प्रॉपर्टी को शून्य पर सेट करें। – Zoey

-1

एएसपी.NET में, एसिंक विधि का उपयोग करते हुए कोई अर्थ नहीं है यदि थ्रेड एआईएसएनसी विधि से अपेक्षित भूमिका है।
जब मैं वेबक्लिएंट एसिंक शुरू करता हूं तो यह मुख्य थ्रेड समाप्त होने पर हमेशा जुड़ता है (एएसपीएक्स प्रस्तुत करने से पहले)।

विषय के बारे में महान लेख: http://weblogs.asp.net/gunnarpeipman/archive/2010/09/07/making-asynchronous-calls-to-web-services-during-asp-net-page-processing.aspx

enter image description here

यहाँ

इसके बारे में अन्य जानकारी कर रहे हैं: WebClient async callback not called in ASP.NET MVC

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