MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Зависает программа. C#"
Answer 897089
В вашем коде трудно разобраться, но выглядит как будто вы никак не используете CancellationToken и не реализуете таймаут для сетевых операций. Для асинхронных сетевых операций, в отличие от синхронных, Request.Timeout играет роль только на начальном этапе от отправки заголовка до получения первых байт ответа. При обрыве связи на последующей загрузке они просто тихо умирают (никогда не заканчиваются), поэтому таймаут нужно реализовать вручную, как-то так:
static async Task<string> Download(string url) { HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url); var resp = await Request.GetResponseAsync(); var stream = resp.GetResponseStream(); MemoryStream ms = new MemoryStream(); using (stream) using (ms) { await stream.CopyToAsync(ms); ms.Seek(0, SeekOrigin.Begin); var rd = new System.IO.StreamReader(ms); return await rd.ReadToEndAsync(); } } private async void button1_Click(object sender, EventArgs e) { const string url = "http://example.com/"; var res = await Task.WhenAny(Download(url),Task.Delay(10000)); if (res is Task<string>) textBox1.Text = (res as Task<string>).Result; else textBox1.Text = "Timeout expired!"; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.