Я начинаю несколько потоков и хочу узнать, когда любой после этого заканчивается. Я знаю, что следующий код:Подождите, пока НИКАКАЯ нить не закончится, а не ВСЕ
foreach (Thread t in threads)
t.Join();
Но это будет только ждать все нитей вместе. Это слишком поздно. Мне нужно знать, когда заканчивается один поток, даже когда другие потоки все еще работают. Я ищу что-то эквивалентное WaitAny
только для потоков. Но я не могу добавить код ко всем тем, которые я контролирую, поэтому использование сигналов или других объектов синхронизации не является вариантом.
Некоторые уточнения: Я работаю над инструментом ведения журнала/отслеживания, который должен регистрировать деятельность приложения. Я могу вставлять логические операторы при запуске потока, но я не могу вставить оператор журнала на все возможные пути из потока (несколько точек выхода, исключения и т. Д.). Поэтому я хотел бы зарегистрировать новый поток и затем получить уведомление, когда он закончит писать запись в журнале. Я мог асинхронно Join
на каждом потоке, но это означает второй поток для каждого контролируемого потока, который может показаться немного большим. Нитки используются различными способами, будь то BackgroundWorker
, Task
или пул. По сути, это нить, и я хотел бы знать, когда это будет сделано. Точный механизм потока определяется приложением, а не протоколирующим решением.
Это запах кода. Вы не будете знать, какая * нить завершена, поэтому вы не можете рассуждать о том, какая работа действительно была сделана. –
Я добавил больше информации о том, что я пытаюсь сделать. Конечно, мне нужно знать, какой поток закончен, иначе это было бы бесполезно в этом случае. – ygoe
Я иду с Гансом на этом. Почему у вашего кода потока есть несколько точек выхода? Поместите попытку/поймать ВСЕ код потока и, если вы хотите выйти где-то посередине, бросьте. Все мои другие сомнения охвачены существующими ответами - почему вы постоянно создаете/завершаете/уничтожаете потоки, вместо того, чтобы использовать потоки или потоки жизненного цикла приложения, которые только что передаются? –