C#. Thread.CurrentThread.IsBackground

189
18 мая 2017, 08:40

Вопрос, наверняка, окажется глупым и не носящем практической ценности, но тем не менее. Сейчас вплотную разбираюсь с многопоточностью и параллельным программированием. На всех ресурсах пишут приблизительно следующее. "Приложение запускается всегда в приоритетном потоке...." и "При завершении всех приоритетных потоков, все фоновые также завершаются, даже, если не выполнили свои задачи". Отсюда сабж, почему приложение не завершается, когда явно указывается

Thread.CurrentThread.IsBackground = true;

?

Просьба помочь разобраться. И прицепом еще один. В чем практическое отличие

Task task = new Task(MyTask);

от

Thread tr = new Thread(new ThreadStart(MyTask));

?

я так понял, Задачи в целом эффективнее распределяются за счет планировщика задач

Answer 1

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

По поводу второй части вопроса:

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

Для случая использования, который вы привели, разница в эффекте незначительна: Task в том виде, в котором он вызывается в вашем с коде из вопроса, выполняется на потоке из пула потоков, а Thread создаётся вне пула. Но есть разница в использовании.

Для Thread'а вы можете лишь вызвать Join, и синхронно дождаться его завершения.

Для Task вы можете, кроме того, установить продолжение посредством ContinueWith, которое будет выполнено в будущем, по завершению этого Task'а. Кроме того, вы можете дождаться о окончания Task'а асинхронно, используя await. Вы можете снаружи поймать и обработать исключение, произошедшее при выполнении Task'а. Всё это с Thread'ом недоступно.

READ ALSO
Как передать звук с сервера на клиент?

Как передать звук с сервера на клиент?

Доброго времени суток

236
Печать Word документа

Печать Word документа

Изучаю документацию по работе с Word документами

264
Как изменить глобальной форматирование даты в mssql/mssql_fetch_assoc?

Как изменить глобальной форматирование даты в mssql/mssql_fetch_assoc?

Суть в чём: есть БД MSSQL и запрос в PHP, результат которого извлекается за счет mssql_fetch_assocТак вот на разных серверах дата в выборке приходит в разных...

322
PHP imagecropauto заменяет прозрачный фон на чёрный

PHP imagecropauto заменяет прозрачный фон на чёрный

На входе PNG с прозрачным фономКогда начинаю обрезать края, всё что не обрезано (на фото сложная фигура с кривыми краями) заливается чёрным...

538