Спиннинг нового потока - нужно ли мне заботиться о сборке мусора - PullRequest
8 голосов
/ 07 июня 2011

У меня немного заморозка мозга, поэтому я подумал, что я добавлю это к коллективному гению SO ...

У меня есть событие, которое поднимается (это будетв потоке «raiser»), и я его потребляю.

Однако, как только я обработаю это событие, мне нужно запустить другой поток, чтобы выполнить рабочую нагрузку, обозначенную этим событием.Итак, я использую:

private void MyEventHandler(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(MyHandler));
    t.Start();
}

private void MyHandler()
{
    DoStuff(); // takes a long time
}

Мой вопрос таков: нужно ли беспокоиться о жизненном цикле переменной t?т.е. может ли t быть сборщиком мусора, таким образом прерывая работу, выполняемую в DoStuff()?

Ответы [ 3 ]

8 голосов
/ 07 июня 2011

Нет особой причины, по которой вам нужно отслеживать переменную Thread.GC не убьет поток, когда t выйдет из области видимости.

Я не знаю, как долго "long time", но вам лучше использовать что-то вроде ThreadPool.QueueUserWorkItem .То есть:

private void MyEventHandler(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(MyHandler);
}

private void MyHandler(object state)
{
    DoStuff();
}
1 голос
/ 07 июня 2011

Если я правильно понимаю, вы находитесь на пороге того, что поток может быть собран мусором, пока он еще работает.И это произошло бы потому, что после выхода из метода нет ссылки на т.

Но вам не нужно бояться.Пока поток работает, на него будет ссылка, и поток не будет собирать мусор.

0 голосов
/ 07 июня 2011

Может ли работа потока и объекты быть GCed?Да.Произойдет ли это автоматически?Как только поток завершен.

Но если это действительно длительный процесс, который не указывает на сбой обратно в поток, он может потенциально заблокировать ресурсы на неопределенный срок.

В этих случаях обратный вызовмеханизм может быть лучшим решением для того, чтобы оставить поток открытым на неопределенный период.

...