Как убить зависший поток? - C#

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

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

В методе который запускается в потоке есть участок кода где посылаются запросы через прокси, на этом участке поток может бесконечно зависнуть. Убить его с помощью Thread.Abort() не получается. Уже замучился перезапускать программу, хочется как-то уже решить эту проблему.

Решение задачи: «Как убить зависший поток?»

textual
Листинг программы
  1. namespace ConsoleApplication293
  2. {
  3.     using System;
  4.     using System.Net;
  5.     using System.Net.Http;
  6.     using System.Text;
  7.     using System.Threading;
  8.     using System.Threading.Tasks;
  9.  
  10.     internal class Program
  11.     {
  12.         private static void Main()
  13.         {
  14.             var listener = new HttpListener();
  15.             listener.Prefixes.Add("http://localhost:7777/");
  16.             listener.Start();
  17.             ProcessAsync(listener);
  18.  
  19.             try
  20.             {
  21.                 var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
  22.  
  23.                 var awaiter = MainAsync(cts.Token).GetAwaiter();
  24.                 awaiter.GetResult();
  25.             }
  26.             catch (OperationCanceledException e)
  27.             {
  28.                 Console.WriteLine(e.Message);
  29.             }
  30.  
  31.             Console.ReadKey();
  32.         }
  33.  
  34.         private static async Task MainAsync(CancellationToken token)
  35.         {
  36.             using (var client = new HttpClient())
  37.             {
  38.                 var content =
  39.                     await client.GetAsync("http://localhost:7777/", HttpCompletionOption.ResponseContentRead, token);
  40.  
  41.                 Console.WriteLine(await content.Content.ReadAsStringAsync());
  42.             }
  43.         }
  44.  
  45.         private static async void ProcessAsync(HttpListener listener)
  46.         {
  47.             while (true)
  48.             {
  49.                 var context = await listener.GetContextAsync();
  50.                 await HandleRequestAsync(context);
  51.             }
  52.         }
  53.  
  54.         private static async Task HandleRequestAsync(HttpListenerContext context)
  55.         {
  56.             // FOR SLOW
  57.             await Task.Delay(TimeSpan.FromSeconds(10));
  58.  
  59.             var response = context.Response;
  60.             var responseString = "<HTML><BODY> TEST!</BODY></HTML>";
  61.             var buffer = Encoding.UTF8.GetBytes(responseString);
  62.             response.ContentLength64 = buffer.Length;
  63.             using (var output = response.OutputStream)
  64.             {
  65.                 output.Write(buffer, 0, buffer.Length);
  66.             }
  67.         }
  68.     }
  69. }

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


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

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

7   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы