Следует ли всегда сохранять ссылку на работающий объект Thread в C #? - PullRequest
11 голосов
/ 24 декабря 2008

Или можно сделать что-то вроде этого:

new Thread( new ThreadStart( delegate { DoSomething(); } ) ).Start();

Кажется, я вспоминаю, что при таком сценарии объект Thread будет собираться мусором, но основной поток ОС будет продолжать работать до тех пор, пока в него не перейдет конец делегата. Я в основном ищу функциональность ThreadPool, но не хочу, чтобы потоки были фоновыми потоками (т.е. я хочу, чтобы они поддерживали приложение в рабочем состоянии).

Обновление:
По словам Джейсона, CLR фактически сохраняет внутреннюю ссылку на объект Thread во время работы, поэтому он не будет собирать мусор до тех пор, пока поток не выйдет.

Ответы [ 6 ]

12 голосов
/ 24 декабря 2008

Обычно я обнаружил, что если мне нужно напрямую запустить новый поток, как вы в своем примере, а не извлекать его из пула потоков, то это длительный поток, и мне понадобится ссылка на него позже убить его, контролировать его и т. д. Для потоков с коротким запуском, таких как вызов ввода-вывода в фоновом потоке и т. д., я всегда использую поток пула потоков (обычно косвенно через вызов метода someDelete.BeginBlah (...)). При использовании потока пула потоков, подобного этому, я предпочитаю НЕ хранить ссылки. Я не знаю, может ли другой программист неправильно использовать ссылку на этот поток. Если мне не нужна ссылка, я не храню ее, чтобы загромождать код.

Редактировать: Чтобы ответить на ваши изменения о потоках, собираемых мусором, это не произойдет во время работы потока. CLR сохраняет ссылку на каждый работающий поток. Объект, представляющий поток, НЕ будет собран.

2 голосов
/ 24 декабря 2008

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

1 голос
/ 24 декабря 2008

У меня было несколько случаев в производственном коде, где это было уместно. Итак, определение и запуск потока в одной строке без сохранения ссылки имеет свое место. Я думаю, что, сохраняя ссылку «на всякий случай», вы перепроектируете ее позже, и вам не хватает принципа создания самой простой вещи, которая работает.

И, во второй части, нет, это не будет GC'd, пока он работает; потоки - это объекты корневого уровня, из которых GCtor будет искать ссылки. Экземпляр Thread будет только GCd, если он больше не доступен ни одному из запущенных потоков, включая тот, который вы на нем запускаете.

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

0 голосов
/ 24 декабря 2008

В дополнение к тому, что "m3rLinEz" опубликовал выше, есть еще один недостаток: если в вашем потоке возникнет какое-либо исключение, даже такие случаи будет трудно обнаружить.

0 голосов
/ 24 декабря 2008

Да, вы должны, потому что вы никогда не знаете, когда вам придется изменить код позже, чтобы каким-то образом обработать поток. Это, и помещать слишком много вещей в одну строку просто ужасно.

Итак, если честно, вы можете сделать это по-своему, поэтому ответ действительно сводится к предпочтениям стиля кода.

0 голосов
/ 24 декабря 2008

Было бы хорошо задать вопрос "Как часто можно запускать эту ветку?" Это приложение для каждого приложения, класса, экземпляра объекта или вызова метода? Это может сказать вам, в какой переменной (если она есть) хранить ее.

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