Сборка мусора с ThreadPool - PullRequest
       20

Сборка мусора с ThreadPool

3 голосов
/ 02 ноября 2011

Учитывая следующее ...

public MyClass
{
    public void MyClass()
    {
        var myWorkerClass = new MyWorkerClass();
        myWorkerClass.DoSomething();
        // and exit quickly
    }
}

public MyWorkerClass()
{
    public void DoSomething()
    {
        ThreadPool.QueueUserWorkItem(() =>
            {
                SomeLongRunningProcess();
            });
    }

    public static void SomeLongRunningProcess()
    {
        // Something that takes a long time
    }
}

Когда MyWorkerClass и MyClass получают право на сборку мусора?

Я думаю, что анонимная функция в MyWorkClass.DoSomething () будет храниться в пространстве объявления локальной переменной MyWorkerClass. Этого будет достаточно, чтобы сохранить их, пока поток не завершится. Это правильно?

1 Ответ

2 голосов
/ 02 ноября 2011

MyClass должен иметь право на получение немедленно.MyWorkerClass получит право на коллекцию после завершения SomeLongRunningProcess () (при условии, что упомянутый выше метод ссылается на this, чего нет в вашем примере).

Поскольку ваш код стоит сейчас, оба экземпляра сразу же имеют право.

Если вы хотите, чтобы MyClass или MyWorkerClass зависали, назовите его в SomeLongRunningProcess или закрытии, которое его вызывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...