StreamReader, как задать Timeout? - C#
Формулировка задачи:
Есть у меня класс, называю его Мини браузер! Вот часть кода ..
Делаю подключение через прокси, толи он вырублен толи он медленный, но ошибку выдаёт типа тамймаут на чтение и говорит что вот здесь она while ((line = stream.ReadLine()) != null) lineAll += line; Посмотрел что успело счесть, тоесть там есть инфа, но не полностью, видимо очень медленно загружает, стандартное время таймаута 300 секунд, пытался ставить меньше, но тогда вообще не работают запросы ...
Пишу вот так stream.ReadTimeout = 20000; в верхней функции WebQuery0(..)
Перелазил инет, нет ничего полезного ..
public Stream WebQuery0(string url, string referer = "") { if (url == "") return Stream.Null; if (Regex.IsMatch(url, "[А-я]+")) new IdnMapping().GetAscii(url); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Accept = this.Accept; request.UserAgent = this.UserAgent; request.Headers.Add("Accept-Encoding", this.AcceptEncoding); request.Headers.Add("Accept-Language", this.AcceptLanguage); request.Headers.Add("Cache-Control", this.CacheControl); request.Timeout = 20 * 1000; request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; request.CookieContainer = this.Cookies; if (this.Proxy != null) request.Proxy = this.Proxy; if (referer != "") request.Referer = referer; try { Stopwatch sWatch = new Stopwatch(); sWatch.Start(); this.Response = (HttpWebResponse)request.GetResponse(); this.Cookies.Add(this.Response.Cookies); Stream stream = this.Response.GetResponseStream(); sWatch.Stop(); this.Ms = sWatch.ElapsedMilliseconds; return stream; } catch { return Stream.Null; } } public string WebQuery(string url, string referer = "") { using (StreamReader stream = new StreamReader(this.WebQuery0(url, referer), Encoding.UTF8)) { string line, lineAll = ""; try { while ((line = stream.ReadLine()) != null) lineAll += line; } catch { return ""; } return lineAll; } }
Решение задачи: «StreamReader, как задать Timeout?»
textual
Листинг программы
public string WebQuery(string url, string referer = "") { using (Stream stream = WebQuery0(url, referer)) { var cancelSource = new CancellationTokenSource(); MemoryStream mstream = new MemoryStream(); Task copyTask = stream.CopyToAsync(mstream, 4096, cancelSource.Token); if (copyTask.Wait(TimeSpan.FromSeconds(20))) { return Encoding.UTF8.GetBytes(mstream.ToArray()); } cancelSource.Cancel(); return null; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д