У меня есть объект в C #, на котором мне нужно регулярно выполнять метод. Я хотел бы, чтобы этот метод выполнялся только тогда, когда другие люди используют мой объект, как только люди перестанут использовать мой объект, я бы хотел, чтобы эта фоновая операция прекратилась.
Итак, вот простой пример (он не работает):
class Fish
{
public Fish()
{
Thread t = new Thread(new ThreadStart(BackgroundWork));
t.IsBackground = true;
t.Start();
}
public void BackgroundWork()
{
while(true)
{
this.Swim();
Thread.Sleep(1000);
}
}
public void Swim()
{
Console.WriteLine("The fish is Swimming");
}
}
Проблема в том, что если я где-то создаю новый объект Fish, он никогда не собирает мусор, потому что существует фоновый поток, ссылающийся на него. Вот иллюстрированная версия неработающего кода.
public void DoStuff()
{
Fish f = new Fish();
}
// after existing from this method my Fish object keeps on swimming.
Я знаю, что объект Fish должен быть одноразовым, и я должен очистить нить при утилизации, но я не контролирую своих абонентов и не могу гарантировать, что вызов утилизации.
Как мне обойти эту проблему и убедиться, что фоновые потоки автоматически удаляются, даже если Dispose не вызывается явно?