Как убить зависший поток? - 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); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д