Если все ваши потоки бездействуют (т. Е. Ожидают в очереди), а очередь пуста, значит, все готово.
Простой способ справиться с тем, чтобы потоки использовали тайм-аут, когдаони пытаются получить доступ к очереди.Что-то вроде BlockingCollection.TryTake .Всякий раз, когда TryTake
истекает, поток обновляет поле, чтобы сказать, как долго он простаивает:
while (!queue.TryTake(out item, 5000, token))
{
if (token.IsCancellationRequested)
break;
// here, update idle counter
}
Затем вы можете иметь таймер, который запускается каждые 15 секунд или около того, чтобы проверять все бездействующие потоки.счетчики.Если все потоки простаивали в течение некоторого периода времени (возможно, минуты), таймер может установить токен отмены.Это убьет все темы.Ваша основная программа также может отслеживать токен отмены.
Кстати, вы можете сделать это без BlockingCollection
и отмены.Вам просто нужно создать собственный механизм сигнализации отмены, и если вы используете блокировку в очереди, вы можете заменить синтаксис блокировки на Monitor.TryEnter
и т. Д.
Есть несколько других способовсправиться с этим, хотя они потребуют серьезной реструктуризации вашей программы.