Когда полезно использовать System.Threading.Task?

Я использовал большую часть библиотеки Threading. Я хорошо знаком с созданием новых потоков, созданием BackgroundWorkers и использованием встроенного .NET ThreadPool (все это очень круто).

Однако я никогда не нашел причины использовать класс Task. Я видел, возможно, один или два примера людей, использующих их, но примеры были не очень ясными, и они не дали обзор на высоком уровне, почему нужно использовать задачу вместо нового потока.

Вопрос 1: На высоком уровне, когда используется задача полезная по сравнению с одним из других методов для parallelism в .NET?

Вопрос 2: У кого-нибудь есть пример простой и/или средней сложности, демонстрирующий, как использовать задачи?

Ответы

Ответ 1

Есть два основных преимущества при использовании Task s:

  • Task может представлять любой результат, который будет доступен в будущем (общая концепция не специфична для .Net и называется future), а не просто вычисление. Это особенно важно в .Net 4.5 с упором на использование Task для асинхронных операций. Поскольку операция, которая получает результат, может завершиться неудачей, Task также может представлять ошибки.
  • Task имеет множество методов для их работы. Вы можете синхронно ждать, пока он не закончится (Wait()), дождитесь его результата (Result), настройте некоторую операцию, когда Task закончит (ContinueWith()), а также некоторые методы, которые работают с несколькими Task (WaitAll(), WaitAny(), ContinueWhenAll()). Все это возможно с использованием других методов параллельной обработки, но вам придется делать это вручную.

И есть также несколько меньших преимуществ использования Task: