В основу TPL положен классTask.Элементарная единица исполнения инкапсулируется в TPL средствами классаTask,а неThread.КлассTaskотличается от классаThreadтем, что он является абстракцией, представляющей асинхронную операцию. А в классеThreadинкапсулируется поток исполнения. Разумеется, на системном уровне поток по-прежнему остается элементарной единицей исполнения, которую можно планировать средствами операционной системы. Но соответствие экземпляра объекта классаTaskи потока исполнения не обязательно оказывается взаимно-однозначным. Кроме того, исполнением задач управляет планировщик задач, который работает с пулом потоков. Это, например, означает, что несколько задач могут разделять один и тот же поток. КлассTask(и вся остальная библиотека TPL) определены в пространстве именSystem.Threading.Tasks.
Создание задачи
Создать новую задачу в виде объекта классаTaskи начать ее исполнение можно самыми разными способами. Для начала создадим объект типаTaskс помощью конструктора и запустим его, вызвав методStart (). Для этой цели в классеTaskопределено несколько конструкторов. Ниже приведен тот конструктор, которым мы собираемся воспользоваться:
public Task(Action
где
public delegate void Action()
Таким образом, точкой входа должен служить метод, не принимающий никаких параметров и не возвращающий никаких значений. (Как будет показано далее, делегатуActionможно также передать аргумент.)
Как только задача будет создана, ее можно запустить на исполнение, вызвав методStart (). Ниже приведена одна из его форм.
public void Start()
После вызова метода Start () планировщик задач запланирует исполнение задачи. В приведенной ниже программе все изложенное выше демонстрируется на практике. В этой
// Создать и запустить задачу на исполнение.
using System;
using System.Threading;
using System.Threading.Tasks;
class DemoTask {
static void MyTask() {
Console.WriteLine("MyTask() запущен");
for(int count = 0; count < 10; count++) {
Thread.Sleep(500);
Console.WriteLine("В методе MyTask(), подсчет равен " + count);
}
Console.WriteLine("MyTask завершен");
}