Как убить зависший поток? - 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);
}
}
}
}