StreamReader, как задать Timeout? - C#

Узнай цену своей работы

Формулировка задачи:

Есть у меня класс, называю его Мини браузер! Вот часть кода ..
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;
            }
        }
Делаю подключение через прокси, толи он вырублен толи он медленный, но ошибку выдаёт типа тамймаут на чтение и говорит что вот здесь она while ((line = stream.ReadLine()) != null) lineAll += line; Посмотрел что успело счесть, тоесть там есть инфа, но не полностью, видимо очень медленно загружает, стандартное время таймаута 300 секунд, пытался ставить меньше, но тогда вообще не работают запросы ... Пишу вот так stream.ReadTimeout = 20000; в верхней функции WebQuery0(..) Перелазил инет, нет ничего полезного ..

Решение задачи: «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;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы