Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

C#. Thread.CurrentThread.IsBackground

Вопрос, наверняка, окажется глупым и не носящем практической ценности, но тем не менее. Сейчас вплотную разбираюсь с многопоточностью и параллельным программированием. На всех ресурсах пишут приблизительно следующее. "Приложение запускается всегда в приоритетном потоке...." и "При завершении всех приоритетных потоков, все фоновые также завершаются, даже, если не выполнили свои задачи". Отсюда сабж, почему приложение не завершается, когда явно указывается
Thread.CurrentThread.IsBackground = true;
?
Просьба помочь разобраться. И прицепом еще один. В чем практическое отличие
Task task = new Task(MyTask);
от
Thread tr = new Thread(new ThreadStart(MyTask));
?
я так понял, Задачи в целом эффективнее распределяются за счет планировщика задач


Ответ

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

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

Комментариев нет:

Отправить комментарий