Câu trả lời:
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.
var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")
và sau đótaskDownload.Wait(TimeSpan.FromSeconds(5));
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 WebRequest
lớ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ở.
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ì?
using
lệnh được đoạn mã này sử dụng.
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.
stream.ReadTimeout
lớn hơn nó thực sự mất để thực hiện yêu cầu