← Все вопросы

Чем Task отличается от Thread в C# и что такое TPL?

Задан 25 месяцев назад489 просмотров2 ответа
10

Запутался: есть Thread, есть Task, есть какая-то TPL. Хочу запустить фоновую работу. Что использовать и почему все советуют Task, а не Thread?

Task.Run(() => DoWork());

2 ответа

17
✓ Принятый ответ — помог автору

TPL (Task Parallel Library) — это набор типов вокруг Task, который абстрагирует работу с потоками. Главное отличие от Thread:

  • Thread — это отдельный ОС-поток. Создание дорогое, ресурсов много.
  • Task — это единица работы, которая выполняется на потоке из пула (ThreadPool). Пул переиспользует потоки, поэтому это дёшево и масштабируемо.
// Запуск фоновой работы
Task<int> task = Task.Run(() =>
{
    // тяжёлые вычисления
    return 40 + 2;
});

int result = await task; // 42

Плюсы Task: возвращает результат (Task<T>), удобно компонуется (ContinueWith, WhenAll, WhenAny), интегрирован с async/await, поддерживает отмену через CancellationToken.

Правило: для CPU-задач, которые надо вынести с UI-потока — Task.Run. Прямой Thread нужен крайне редко (например, нужен поток с особыми настройками приоритета/STA).

6

Дополню про комбинирование задач — это сильная сторона TPL:

Task<int> t1 = Task.Run(() => 10);
Task<int> t2 = Task.Run(() => 20);

int[] results = await Task.WhenAll(t1, t2); // ждём обе
Console.WriteLine(results.Sum());           // 30

С голым Thread такое пришлось бы городить вручную через Join и общие переменные.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект