Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти
P S Код написан на Boo / Python
Здравствуйте, _Claus_, Вы писали:
_C_>Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти _C_>P S Код написан на Boo / Python
Я недавно столкнулся с такой же проблемой. Беда в том, что Thread.Abort абортит поток только в случае, если он был заблокирован в managed коде. Т.к. HttpListener это всего лишь обертка над http.sys, которая входит в ядро ОС, и блокировка происходит уже в unmanaged коде, то прервать выполнение потока не получается. По крайней мере, я более разумного объяснения этому факту не нашел.
Проблему в своем случае обошел с помощью последовательного вызова cl.BeginGetContext() -> cl.EndGetContext() -> ...
Здравствуйте, Undertaker, Вы писали:
U>Я недавно столкнулся с такой же проблемой. Беда в том, что Thread.Abort абортит поток только в случае, если он был заблокирован в managed коде. Т.к. HttpListener это всего лишь обертка над http.sys, которая входит в ядро ОС, и блокировка происходит уже в unmanaged коде, то прервать выполнение потока не получается.
Совершенно справедливо!
Меня смущает, что в .net нет аналога C exit() ? Этож почему я не могу завершить прогу, если хочу?!
Здравствуйте, _Claus_, Вы писали:
_C_>Здравствуйте, Undertaker, Вы писали:
U>>Я недавно столкнулся с такой же проблемой. Беда в том, что Thread.Abort абортит поток только в случае, если он был заблокирован в managed коде. Т.к. HttpListener это всего лишь обертка над http.sys, которая входит в ядро ОС, и блокировка происходит уже в unmanaged коде, то прервать выполнение потока не получается. _C_>Совершенно справедливо! _C_>Меня смущает, что в .net нет аналога C exit() ? Этож почему я не могу завершить прогу, если хочу?!
а так:
static void Main(string[] args)
{
Console.WriteLine("Main() стартует...");
AppDomain ad = AppDomain.CreateDomain("worker");
Thread t = new Thread(delegate()
{
ad.DoCallBack(Work);
});
t.Start();
Thread.Sleep(100);
Console.WriteLine("Пробуем убить Work()...");
t.Abort();
if (!t.Join(2000))
Console.WriteLine("Work() убиться отказался :(");
else
Console.WriteLine("Work() убит!");
Console.WriteLine("Выгружаем домен");
AppDomain.Unload(ad);
Console.WriteLine("Поток завершен и программа тож!");
}
static void Work()
{
Console.WriteLine("Work() стартует...");
// тут нечто неубиваемое
Console.WriteLine("Work() нормально завершается");
}
...
_C_>в основном потоке
_C_>thread = Thread(http_server) _C_>thread.Start() _C_>... _C_>thread.Abort()
_C_>Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти _C_>P S Код написан на Boo / Python
Спасибо за совет! Наверняка он работает. Я нашел решение проще: System.Environment.Exit(), вызываю после Application.Run(MainForm()), тоже все убивается