Я використовую webClient.DownloadFile()
для завантаження файлу, чи можу я встановити час очікування для цього, щоб це не зайняло так багато часу, якщо він не може отримати доступ до файлу?
Відповіді:
Спробуйте WebClient.DownloadFileAsync()
. Ви можете зателефонувати CancelAsync()
за таймером із власним тайм-аутом.
var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")
а потімtaskDownload.Wait(TimeSpan.FromSeconds(5));
Моя відповідь звідси
Ви можете створити похідний клас, який встановить властивість тайм-ауту базового WebRequest
класу:
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;
}
}
і ви можете використовувати його так само, як базовий клас WebClient.
request.Timeout
. Помилка повідомлення '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?)
, чого мені не вистачає?
using
директиви, які використовуються цим фрагментом коду.
Якщо припустити, що ви хотіли зробити це синхронно, за допомогою методу WebClient.OpenRead (...) та встановлення часу очікування на потоці, який він повертає, дасть вам бажаний результат:
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);
}
}
}
}
Виведення з WebClient та перевизначення GetWebRequest (...) для встановлення тайм-ауту, запропонованого @Beniamin, не працювали для мене як, але це так.
stream.ReadTimeout
більше, ніж насправді знадобилося для виконання запиту