Я могу безопасно полагаться на IsBackground в Потоках, когда приложение завершается?

Сброс Единица:

Нажатие Высокий звук + F2 и выполненный следующая команда:

unity --reset
5
задан dr. evil 30 August 2009 в 16:12
поделиться

4 ответа

Thread.Abort генерирует исключение, поэтому, если ваш код уже правильно написан для использования finally / using, он должен корректно выйти из строя и освободить все ресурсы.

edit

Я, вероятно, должен рассказать немного подробнее. Во-первых, исключение имеет тип ThreadAbortException. Интересно то, что даже если вы поймаете его и ничего не сделаете, он не уйдет. Другими словами, как только он покидает ваш блок catch, он продолжает бросаться. Это сделано для того, чтобы (обычно плохая) практика перехвата исключения и его проглатывания не останавливала прерывание потока.

4
ответ дан 18 December 2019 в 13:16
поделиться

На странице MSDN в свойстве IsBackground указано:

Поток является либо фоновым потоком или поток переднего плана. Задний план потоки идентичны переднему плану темы, кроме этого фона потоки не мешают процессу прекращение. Когда-то весь передний план потоки, принадлежащие процессу, имеют прекращено, общий язык время выполнения завершает процесс. любой оставшиеся фоновые потоки остановлен и не завершен.

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

5
ответ дан 18 December 2019 в 13:16
поделиться

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

0
ответ дан 18 December 2019 в 13:16
поделиться

Блоки являются замыканиями, и arg действительно доступен внутри блока Class.new . Он просто недоступен в методе foo , поскольку def запускает новую область. Если заменить def на define _ method , который принимает блок, вы увидите нужный результат:

def R(arg)
    Class.new do
        define_method(:foo) do
           puts arg
        end
    end
end

class A < R("Hello!")
end

A.new.foo # Prints: Hello!
-121--1665181-

Для использования темы пользовательского интерфейса jQuery используйте следующий код:

$('#'+gridName+' tr:nth-child(even)').removeClass("ui-priority-secondary");
$('#'+gridName+' tr:nth-child(odd)').addClass("ui-priority-secondary");

Я использую этот код при выполнении сортировки вручную (перетаскивание)

-121--3153611-

Сообщение Джонатана Гринстеда содержит хорошую сводку о IsBackground :

Свойство IsBackground позволяет сообщить среде выполнения, является ли поток поток переднего плана (UI) или фон резьба. По умолчанию все потоки созданы как потоки переднего плана, если вы изменяете это свойство.

Почему нас это волнует?

Ну, среда выполнения .NET что-то делает специальный при последнем переднем плане поток завершается - он прерывает все фоновые потоки и завершает приложение. (Мы знаем, что Thread.Abort неверно, однако, если приложение завершение работы в любом случае, что зло Очень ограниченная продолжительность.)

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

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

5
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: