У меня есть служба Windows, которая работает непрерывно и создает некоторые потоки, чтобы выполнить некоторую работу. Я хочу убедиться, что эти потоки правильно утилизированы (мусор, собранный после их завершения.Threads and garb collection
Однако, я также хочу, чтобы у меня была возможность проверить, периодически ли они живы, и прекратить их, если они есть. Я не могу ссылаться на них, потому что тогда они не собирались собирать мусор.
Есть ли альтернативный способ проверить существование/состояние пользовательских потоков? Я думал, может быть, что-то вроде выполняется с помощью WeakReference
: (я не могу полностью проверить прямо сейчас, или я просто проверить это сам)
List<WeakReference> weakReferences;
Thread myThread = new Thread(() => Foo());
WeakReference wr = new WeakReference(myThread);
weakReferences.Add(wr); //adds a reference to the thread but still allows it to be garbage collected
myThread.Start();
myThread = null; //get rid of reference so thread can be garbage collected
, а затем в начале моего onTimeElapsed события (курсируют каждые 5 минут):
foreach(WeakReference wr in weakReferences)
{
Thread target = wr.Target as Thread; //not sure if this cast is really possible
if(target.IsAlive && otherLogic)
{
target.Abort();
{
}
Но я не знаю точно, как работает WeakReference. Любые идеи о том, как правильно это сделать?
Самый простой способ убедиться, что ваши потоки очищены - это просто обеспечить, чтобы их работа в конечном итоге заканчивалась (успешно или иначе). Мне интересно об обстоятельствах, в которых поток может быть порожден, и вы хотите очистить его до завершения работы. –
Прекратить нить - это очень плохая идея. Обычно это работает, но вы построили бомба замедленного действия здесь. –