Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами. Когда приложение закрывают, треды остаются висеть некоторое время, пока не отваливаются по таймауту.
Хотелось бы знать в любой момент, сколько у нас активных тредов, чтобы вывести табличку "ждите...", и закрыть основную форму, когда все треды отработали.
Здравствуйте, wmlab2001, Вы писали:
W>Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами.
Непонятно, вы сами их программно создаете?
если да, то почему бы их не хранить в каком -нибудь списке и при закрытии программы мониторить их состояние?
ну и чтобы треды не "висели" нужно создавать их бекграундными по отношению к основному потоку..
если конечно, они создаются "где-то там", то этот совет не подойдет.
Здравствуйте, alexsoff, Вы писали:
A>Здравствуйте, wmlab2001, Вы писали:
W>>Такая ситуация — приложение создает кучу тредов, работающих с интернет-ресурсами. A>Непонятно, вы сами их программно создаете? A>если да, то почему бы их не хранить в каком -нибудь списке и при закрытии программы мониторить их состояние? A>ну и чтобы треды не "висели" нужно создавать их бекграундными по отношению к основному потоку.. A>если конечно, они создаются "где-то там", то этот совет не подойдет.
Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?
Re[3]: Все треды под контролем
От:
Аноним
Дата:
16.09.09 10:40
Оценка:
Здравствуйте, wmlab2001, Вы писали:
W>Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?
средств много
например, используйте AutoResetEvent, с помощью него можно будет оповещать главный поток о закрытие вторичного.
Здравствуйте, wmlab2001, Вы писали:
W>Да, приложение создает их само, по мере поступления запросов, т.е. с созданием их списка запущенных тредов нет пробдем. Проблема в том, что треды не сообщают основной форме о своем закрытии, так что получить список еще ЖИВЫХ тредов — неясно, как. Вот я и спросил, как принято поступать в таком случае?
Вообще-то есть вот такое
Process.Threads Property
Gets the set of threads that are running in the associated process.
Но вроде как в .Net не гарантируется, что Thread есть именно поток в смысле Win32. Вроде как там может быть фибер, но в реальности вроде как все же поток. Но это решение не очень хорошее. Вполне возможно. что у тебя рантайм .Net какой-то свой поток запустил. Будешь теперь исследовать эту коллекцию на предмет отличия своих и не своих потоков ?
Так что самое ИМХО простое решение — считай сам свои потоки. Легко и просто. А насчет того, что они не сообщают — работы на 10 минут, чтобы сообщали.
Хороший ответ, я согласен с предыдущим оратором.
Добавлю, что можно задавать свой Thread.Name, когда ты поток создаёшь, чтобы проще было разбираться, где твои и где чужие.
Ещё я бы использовал ThreadPool по возможности и ManualResetEvent, чтобы основной поток обязательно дожидался окончания всех операций и только тогда окончательно завершался.
Грубо говоря, последня строка твоей проги будет
Я бы постарался вообще от потоков отказаться. Потоков в приложении не должно быть больше, чем ядер в процессоре. Поток — это дорогое удовольствие, их лучше никогда самим не создавать.
Используйте ThreadPool.QueueUserWorkItem, IO completion ports, APM или что-нибудь ещё, и не будут возникать такие уродливые проблемы.
Re: Все треды под контролем
От:
Аноним
Дата:
18.09.09 08:35
Оценка:
Здравствуйте, wmlab2001, Вы писали:
W>Как это сделать правильно?
Вот у Вас когда поток стартует, Вы же ему отдаёте процедуру (например, MyThreadActivity) которую он будет выполнять, так вот вместо неё отдайте другую процедуру: