← Все вопросы
Чем Task отличается от Thread в C# и что такое TPL?
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 и общие переменные.
Ваш ответ
Войдите, чтобы ответить на вопрос.