Страницы

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

суббота, 14 декабря 2019 г.

C#. Thread.CurrentThread.IsBackground

#c_sharp #многопоточность #task


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

Thread.CurrentThread.IsBackground = true;


?

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

Task task = new Task(MyTask);


от

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


?

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


Ответы

Ответ 1



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

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

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