У меня есть служба Windows, которая работает непрерывно и создает несколько потоков для выполнения некоторой работы. Я хочу убедиться, что эти темы правильно утилизированы (мусор собирается после их завершения.
Тем не менее, я также хочу иметь возможность периодически проверять, живы ли они, и прекращать их, если они есть. Я знаю, что не могу хранить какие-либо ссылки на них, потому что тогда они не будут удалены сборщиком мусора.
Есть ли альтернативный способ проверить наличие/состояние пользовательских потоков? Я думал, что может быть что-то вроде следующего, используя 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. Любые идеи о том, как правильно это сделать?