Все треды под контролем
От: wmlab2001  
Дата: 16.09.09 08:41
Оценка:
Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами. Когда приложение закрывают, треды остаются висеть некоторое время, пока не отваливаются по таймауту.

Хотелось бы знать в любой момент, сколько у нас активных тредов, чтобы вывести табличку "ждите...", и закрыть основную форму, когда все треды отработали.

Как это сделать правильно?
Re: Все треды под контролем
От: alexsoff Россия  
Дата: 16.09.09 08:55
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами.

Непонятно, вы сами их программно создаете?
если да, то почему бы их не хранить в каком -нибудь списке и при закрытии программы мониторить их состояние?
ну и чтобы треды не "висели" нужно создавать их бекграундными по отношению к основному потоку..
если конечно, они создаются "где-то там", то этот совет не подойдет.
Re[2]: Все треды под контролем
От: wmlab2001  
Дата: 16.09.09 10:20
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>Здравствуйте, wmlab2001, Вы писали:


W>>Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами.

A>Непонятно, вы сами их программно создаете?
A>если да, то почему бы их не хранить в каком -нибудь списке и при закрытии программы мониторить их состояние?
A>ну и чтобы треды не "висели" нужно создавать их бекграундными по отношению к основному потоку..
A>если конечно, они создаются "где-то там", то этот совет не подойдет.

Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?
Re[3]: Все треды под контролем
От: Аноним  
Дата: 16.09.09 10:40
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?

средств много
например, используйте AutoResetEvent, с помощью него можно будет оповещать главный поток о закрытие вторичного.
Re[3]: Все треды под контролем
От: Pavel Dvorkin Россия  
Дата: 16.09.09 10:48
Оценка: +1
Здравствуйте, wmlab2001, Вы писали:

W>Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?


Вообще-то есть вот такое

Process.Threads Property

Gets the set of threads that are running in the associated process.

Но вроде как в .Net не гарантируется, что Thread есть именно поток в смысле Win32. Вроде как там может быть фибер, но в реальности вроде как все же поток. Но это решение не очень хорошее. Вполне возможно. что у тебя рантайм .Net какой-то свой поток запустил. Будешь теперь исследовать эту коллекцию на предмет отличия своих и не своих потоков ?

Так что самое ИМХО простое решение — считай сам свои потоки. Легко и просто. А насчет того, что они не сообщают — работы на 10 минут, чтобы сообщали.
With best regards
Pavel Dvorkin
Re[4]: Все треды под контролем
От: MatFiz Россия  
Дата: 17.09.09 13:39
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

Хороший ответ, я согласен с предыдущим оратором.
Добавлю, что можно задавать свой Thread.Name, когда ты поток создаёшь, чтобы проще было разбираться, где твои и где чужие.
Ещё я бы использовал ThreadPool по возможности и ManualResetEvent, чтобы основной поток обязательно дожидался окончания всех операций и только тогда окончательно завершался.
Грубо говоря, последня строка твоей проги будет

WaitHandle.WaitAll(currentAsyncResults.Select(o => o.AsyncWaitHandle).ToArray());
How are YOU doin'?
Re: Все треды под контролем
От: Кирилл Осенков Украина
Дата: 18.09.09 07:10
Оценка: +1
Я бы постарался вообще от потоков отказаться. Потоков в приложении не должно быть больше, чем ядер в процессоре. Поток — это дорогое удовольствие, их лучше никогда самим не создавать.

Используйте ThreadPool.QueueUserWorkItem, IO completion ports, APM или что-нибудь ещё, и не будут возникать такие уродливые проблемы.
Re: Все треды под контролем
От: Аноним  
Дата: 18.09.09 08:35
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>Как это сделать правильно?


Вот у Вас когда поток стартует, Вы же ему отдаёте процедуру (например, MyThreadActivity) которую он будет выполнять, так вот вместо неё отдайте другую процедуру:
private static int totalActiveThreadCount;

private void MyThreadActivityWithCounter ()
{
  try
  {
    System.Threading.Interlocked.Increment(ref totalActiveThreadCount);
    MyThreadActivity();
  }
  finally
  {
    System.Threading.Interlocked.Decrement(ref totalActiveThreadCount);
  }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.