2010-06-04 19 views
7

Tôi đang sử dụng phương thức DownloadFileAsyncWebClient để tải xuống một số tệp từ máy chủ và tôi không thể không nhận thấy rằng trong thử nghiệm không chính thức mã của tôi trong VS2010, nó sẽ chặn khoảng 3 giây trong khi bắt đầu, trong loại ý kiến ​​của tôi đánh bại mục đích ở nơi đầu tiên.WebClient.DownloadFileAsync có thực sự chậm không?

Dưới đây là đoạn mã có liên quan của mã:

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 

Tôi đang sử dụng DownloadFileAsync để giữ cho giao diện người dùng từ chặn khi các ứng dụng tải về một tập tin MB ~ 100. Rõ ràng nếu giao diện người dùng chặn trong 3 giây trong khi cuộc gọi bắt đầu, điều đó làm giảm tiện ích một chút, nếu không hoàn toàn.

Tôi khá thiếu kinh nghiệm với C# /. Net (Tôi đã thực hiện một loạt các công cụ .Net 2.0 khoảng 3-4 năm trước, IIRC, nhưng về cơ bản tôi đang chuyển đổi nó ngay bây giờ).

Trả lời

0

Bạn đã tìm hiểu xem sự chậm trễ có trong ứng dụng của mình hay trên mạng không? Để tìm hiểu xem máy chủ đích có chậm hay không, hãy chạy Wireshark và xem thời điểm nhận được phản hồi đầu tiên sau khi yêu cầu được gửi. Có lẽ đó là nơi trì hoãn xảy ra?

Ngoài ra, nếu đây là một phần của ứng dụng lớn thì lần đầu tiên sẽ luôn chậm do chi phí khởi động. Nếu bạn thực sự muốn có được một phép đo tốt, hãy đo tổng thời gian cần thiết cho lần gọi đầu tiên, và cho lần thứ 2 đến lần gọi thứ 10. Từ đó bạn có thể tìm hiểu xem sự chậm trễ là trong chi phí khởi động hay mọi lúc.

7

Tôi đọc ở đâu đó rằng DownloadFileAsync thực sự kiểm tra tên DNS trong một chuỗi chặn, do đó tại sao bạn có thể bị chậm lại. Nếu bạn đặt IP trực tiếp, không nên chặn. Thấy rằng mảnh thông tin ở đây: http://www.csharp-examples.net/download-files/

8

Ngoài những gì Nav nói, có vẻ như vấn đề là web proxy dò, xem câu trả lời này: Why is this WebRequest code slow?

Tôi đã thử nghiệm nó và nó hiện đang làm việc mà không cần bất kỳ ý nghĩa chậm trễ trong lần gọi đầu tiên.

+0

Cảm ơn, mà làm việc một cách hoàn hảo! Đối với những người gặp sự cố tương tự, chỉ cần đặt thuộc tính 'Proxy' của webclient thành null trước khi gọi tải xuống. – Zoey

-1

trong ASP.NET, sử dụng phương thức async không có ý nghĩa nếu chủ đề vai trò được mong đợi từ phương pháp aysnc.
Khi tôi bắt đầu webclient không đồng bộ, nó luôn tham gia khi chuỗi chính kết thúc (trước khi hiển thị aspx).

lớn bài viết về chủ đề: 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

đây là thông tin khác về nó: WebClient async callback not called in ASP.NET MVC

Các vấn đề liên quan