Я использую webClient.DownloadFile()
для загрузки файла, могу ли я установить для этого тайм-аут, чтобы это не заняло много времени, если он не может получить доступ к файлу?
92
Попробуй 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