Мне просто интересно, создает ли новый класс Task в dot.net 4 фоновый или передний поток?
Обычно я устанавливал "IsBackground" в потоке, но нет такого атрибута в Задаче.
Я не смог найти документацию об этом на MSDN: - (
Мне просто интересно, создает ли новый класс Task в dot.net 4 фоновый или передний поток?
Обычно я устанавливал "IsBackground" в потоке, но нет такого атрибута в Задаче.
Я не смог найти документацию об этом на MSDN: - (
Не следует проверять:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
И ответ...
ǝnɹʇ
Он работает как фоновый поток.
Смотрите эту тему:
Если вы ссылаетесь на начало Task<T>
с помощью async
и await
ключевых слов, тогда ответ будет отрицательным. Выдержка из здесь:
"Асинхронные и ожидающие ключевые слова не приводят к созданию дополнительных потоков. Методы Async не требуют многопоточности, поскольку метод async не запускается в своем потоке. Метод выполняется в текущем контексте синхронизации и использует время в потоке только тогда, когда метод активен. Вы можете использовать Task.Run, чтобы переместить работу с привязкой к процессору в фоновый поток, но фоновый поток не помогает в процессе, который просто ждет, когда результаты станут доступными".
Задачи выполняются потоками, которые поступают из пула системных потоков. Поток, который поступает из пула потоков, выполняется по умолчанию по умолчанию.
Если вы еще не уверены в фоновой задаче, просто попробуйте получить доступ к элементу GUI из задачи вроде:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
чтобы получить исключение времени выполнения:
Работа с кросс-потоками недействительна: Элемент управления 'label1' доступен из потока, отличного от потока, на котором он был создан.
точно так же, как с хорошими старыми регулярными фоновыми потоками.
Информация в Документы MSDN (с 2017 года:-), например:
Лучший способ справиться с этим - начать фоновый поток, который выполняет работу с использованием Task.Run и ждет ее результата. Это позволит пользовательский интерфейс должен выглядеть гладко, поскольку работа выполняется.
В этом документе даже есть раздел What happens under the covers
.