Задания создаются как фоновые потоки? - PullRequest
72 голосов
/ 06 марта 2011

Мне просто интересно, создает ли новый класс Task в dot.net 4 поток фона или переднего плана?

Обычно я бы устанавливал "IsBackground" в потоке, но в задании такого атрибута нет.

Мне не удалось найти какую-либо документацию по этому вопросу в MSDN: - (

Ответы [ 5 ]

104 голосов
/ 06 марта 2011

Не должно быть трудно проверить:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

И ответ ...

ǝnɹʇ

8 голосов
/ 21 января 2015

Если вы начинаете Task<T>, используя Task.Run(), тогда да.

Если вы используете async и await, то нет.Отрывок из здесь :

"Ключевые слова async и await не приводят к созданию дополнительных потоков. Асинхронные методы не требуют многопоточности, поскольку асинхронный метод не запускается сам по себеЭтот метод выполняется в текущем контексте синхронизации и использует время в потоке только тогда, когда метод активен. Вы можете использовать Task.Run для перемещения работы, связанной с ЦП, в фоновый поток, но фоновый поток не помогает спроцесс, который просто ждет результатов, чтобы стать доступными. "

5 голосов
/ 06 марта 2011

Похоже, что он работает как фоновый поток.

См. Эту тему:

Запуск нескольких асинхронных задач C #

0 голосов
/ 06 ноября 2017

Если вы еще не уверены в фоновой задаче, просто попробуйте получить доступ к элементу GUI из Задачи, например:

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

, чтобы получить исключение времени выполнения:

Операция с несколькими потоками недопустима: управление 'label1' осуществляется из потока, отличного от потока, в котором он был создан.

, как в старых добрых обычных фоновых потоках.

Есть информация в Документах MSDN (по состоянию на 2017 год :-), например:

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

В этом документе даже есть раздел What happens under the covers.

0 голосов
/ 04 ноября 2015

Задачи выполняются потоками, которые приходят из пула системных потоков.По умолчанию поток из пула потоков выполняется в фоновом режиме.

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