неубиваемый поток с HTTPListener
От: _Claus_  
Дата: 14.04.07 16:03
Оценка:
Привет всем! Имею сабж и не могу забороть:
создаю поток в GUI приложении, в котором создаю HTTPListener:

//код потока http_server
serv = HttpListener() #1
serv.Prefixes.Add("http://*/")
serv.Start()

while serv_run:
ctx = serv.GetContext() #если убрать эту строку, все ок
process(ctx)

в основном потоке

thread = Thread(http_server)
thread.Start()
...
thread.Abort()

Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти
P S Код написан на Boo / Python
Re: неубиваемый поток с HTTPListener
От: Undertaker  
Дата: 14.04.07 16:12
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти

_C_>P S Код написан на Boo / Python

Я недавно столкнулся с такой же проблемой. Беда в том, что Thread.Abort абортит поток только в случае, если он был заблокирован в managed коде. Т.к. HttpListener это всего лишь обертка над http.sys, которая входит в ядро ОС, и блокировка происходит уже в unmanaged коде, то прервать выполнение потока не получается. По крайней мере, я более разумного объяснения этому факту не нашел.

Проблему в своем случае обошел с помощью последовательного вызова cl.BeginGetContext() -> cl.EndGetContext() -> ...
Re[2]: неубиваемый поток с HTTPListener
От: _Claus_  
Дата: 14.04.07 16:55
Оценка:
Здравствуйте, Undertaker, Вы писали:

U>Я недавно столкнулся с такой же проблемой. Беда в том, что Thread.Abort абортит поток только в случае, если он был заблокирован в managed коде. Т.к. HttpListener это всего лишь обертка над http.sys, которая входит в ядро ОС, и блокировка происходит уже в unmanaged коде, то прервать выполнение потока не получается.

Совершенно справедливо!
Меня смущает, что в .net нет аналога C exit() ? Этож почему я не могу завершить прогу, если хочу?!
Re[3]: неубиваемый поток с HTTPListener
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 15.04.07 10:36
Оценка:
Здравствуйте, _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() нормально завершается");
      }
... << RSDN@Home 1.2.0 alpha rev. 675>>
Re: неубиваемый поток с HTTPListener
От: romangr Россия  
Дата: 16.04.07 08:07
Оценка:
Здравствуйте, _Claus_, Вы писали:

...

_C_>в основном потоке


_C_>thread = Thread(http_server)

_C_>thread.Start()
_C_>...
_C_>thread.Abort()

_C_>Как прибить все же поток с HTTPListener? Выполнение thread.Abort() не приводит к завершению, GUI пропадает, программа висит в памяти

_C_>P S Код написан на Boo / Python

thread = Thread(http_server)
thread.IsBackground = true
thread.Start()
...
thread.Abort()
... << RSDN@Home 1.2.0 alpha rev. 670>>
Re[4]: неубиваемый поток с HTTPListener
От: _Claus_  
Дата: 17.04.07 13:53
Оценка:
Спасибо за совет! Наверняка он работает. Я нашел решение проще: System.Environment.Exit(), вызываю после Application.Run(MainForm()), тоже все убивается
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.