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

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

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

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

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

textual
Листинг программы
namespace ConsoleApplication293
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
 
    internal class Program
    {
        private static void Main()
        {
            var listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:7777/");
            listener.Start();
            ProcessAsync(listener);
 
            try
            {
                var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
 
                var awaiter = MainAsync(cts.Token).GetAwaiter();
                awaiter.GetResult();
            }
            catch (OperationCanceledException e)
            {
                Console.WriteLine(e.Message);
            }
 
            Console.ReadKey();
        }
 
        private static async Task MainAsync(CancellationToken token)
        {
            using (var client = new HttpClient())
            {
                var content =
                    await client.GetAsync("http://localhost:7777/", HttpCompletionOption.ResponseContentRead, token);
 
                Console.WriteLine(await content.Content.ReadAsStringAsync());
            }
        }
 
        private static async void ProcessAsync(HttpListener listener)
        {
            while (true)
            {
                var context = await listener.GetContextAsync();
                await HandleRequestAsync(context);
            }
        }
 
        private static async Task HandleRequestAsync(HttpListenerContext context)
        {
            // FOR SLOW
            await Task.Delay(TimeSpan.FromSeconds(10));
 
            var response = context.Response;
            var responseString = "<HTML><BODY> TEST!</BODY></HTML>";
            var buffer = Encoding.UTF8.GetBytes(responseString);
            response.ContentLength64 = buffer.Length;
            using (var output = response.OutputStream)
            {
                output.Write(buffer, 0, buffer.Length);
            }
        }
    }
}

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


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

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

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