Đặt thời gian chờ cho webClient.DownloadFile ()


92

Tôi đang sử dụng webClient.DownloadFile()để tải xuống một tệp, tôi có thể đặt thời gian chờ cho việc này để không mất quá nhiều thời gian nếu nó không thể truy cập tệp không?

Câu trả lời:


42

Cố gắng WebClient.DownloadFileAsync(). Bạn có thể gọi CancelAsync()theo bộ hẹn giờ với thời gian chờ của riêng mình.


2
Tôi không muốn sử dụng bộ hẹn giờ hoặc đồng hồ bấm giờ. Tôi muốn một số phương pháp hack hoặc api tích hợp sẵn. Sử dụng bộ đếm thời gian / đồng hồ bấm giờ chi phí cho tôi đề bổ sung cho xem, trong khi tính năng này có thể đã được thực hiện, vậy tại sao lại phát minh ra bánh xe

@Kilanny: sau đó đi với giải pháp từ một câu trả lời khác. Hoặc sử dụng HttpClient và đặt thuộc tính Thời gian chờ. Cũng xin lưu ý câu trả lời này là từ năm 2009.
abatishchev

8
trong .Net 4.5+, bạn cũng có thể sử dụng var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")và sau đótaskDownload.Wait(TimeSpan.FromSeconds(5));
itho

257

Câu trả lời của tôi đến từ đây

Bạn có thể tạo một lớp dẫn xuất, lớp này sẽ đặt thuộc tính thời gian chờ của WebRequestlớp cơ sở :

using System;
using System.Net;

public class WebDownload : WebClient
{
    /// <summary>
    /// Time in milliseconds
    /// </summary>
    public int Timeout { get; set; }

    public WebDownload() : this(60000) { }

    public WebDownload(int timeout)
    {
        this.Timeout = timeout;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = this.Timeout;
        }
        return request;
    }
}

và bạn có thể sử dụng nó giống như lớp WebClient cơ sở.


3
Chỉ trong trường hợp ai đó đi qua mã hữu ích này tôi đã phải thiết lập thời gian chờ trước khi gọi base.GetWebRequest (địa chỉ)
Darthtong

Resharper phàn nàn về giá trị rỗng có thể có cho "kết quả" và đề xuất kiểm tra null trước khi đặt giá trị Thời gian chờ cho WebRequest. Nhìn vào mã dịch ngược, có vẻ như không thể trừ khi bạn cung cấp một WebRequestModules tùy chỉnh trong web.config của mình, nhưng đối với câu trả lời được ủng hộ như vậy, tôi sẽ thêm nó để đề phòng.
Kevin Coulombe

Tôi nhận được lỗi ở dòng này request.Timeout. Thông báo lỗi 'System.Net.WebRequest' does not contain a definition for 'Timeout' and no extension method 'Timeout' accepting a first argument of type 'System.Net.WebRequest' could be found (are you missing a using directive or an assembly reference?) , tôi đang thiếu cái gì?
Eric

1
@Eric: Tôi đã thêm các usinglệnh được đoạn mã này sử dụng.
Beniamin

1
@titol: sử dụng HttpClient hơn là WebClient.
abatishchev

3

Giả sử bạn muốn thực hiện việc này một cách đồng bộ, sử dụng phương thức WebClient.OpenRead (...) và đặt thời gian chờ trên Luồng mà nó trả về sẽ cho bạn kết quả mong muốn:

using (var webClient = new WebClient())
using (var stream = webClient.OpenRead(streamingUri))
{
     if (stream != null)
     {
          stream.ReadTimeout = Timeout.Infinite;
          using (var reader = new StreamReader(stream, Encoding.UTF8, false))
          {
               string line;
               while ((line = reader.ReadLine()) != null)
               {
                    if (line != String.Empty)
                    {
                        Console.WriteLine("Count {0}", count++);
                    }
                    Console.WriteLine(line);
               }
          }
     }
}

Bắt nguồn từ WebClient và ghi đè GetWebRequest (...) để đặt thời gian chờ mà @Beniamin đề xuất, không hoạt động đối với tôi, nhưng điều này đã làm.


@jeffymorris không phù hợp với tôi. Tôi vẫn get WebException nói "yêu cầu đã bị hủy bỏ - các hoạt động đã timed out" ngay cả khi tôi chỉ định stream.ReadTimeoutlớn hơn nó thực sự mất để thực hiện yêu cầu
chester89

@jeffymoris mặt khác, các giải pháp với WebClient lớp con đã không làm việc một trong hai, vì vậy nó có thể là một vấn đề ở phía máy chủ
chester89
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.