Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ Программирование на С# _Хотов.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
2.22 Mб
Скачать
        1. Массив задач

Также как и с потоками, мы можем создать и запустить массив задач:

using System;

using System.Threading.Tasks;

namespace TaskApp

{

class Program

{

static void Main(string[] args)

{

// первый массив задач

Task[] tasks = new Task[5];

for (int i = 0; i < tasks.Length;i++ )

{

tasks[i] = Task.Factory.StartNew(Display);

}

// второй массив задач

Task[] tasks2 = new Task[5];

for (int i = 0; i < tasks2.Length; i++)

{

tasks2[i] = Task.Factory.StartNew(()=>{

Console.WriteLine("Задача из лямбда-выражения");

});

}

Console.WriteLine("Выполняется работа метода Main");

Task.WaitAll(tasks);

Task.WaitAll(tasks2);

Console.ReadLine();

}

static void Display()

{

Console.WriteLine("Начало работы метода Display");

Thread.Sleep(3000);

Console.WriteLine("Завершение работы метода Display");

}

}

}

здесь мы создаем два массива задач tasks и tasks2. Только теперь в качестве альтернативы мы используем для создания и запуска задач статический метод Task.Factory.StartNew(). В качестве параметра этот метод принимает делегат Action, а значит мы ему можем передать опять же метод Display (как для массива tasks), так и лямбда-выражение (как для массива tasks2). И возвращает этот метод создаваемую и запускаемую задачу.

Для ожидания окончания выполнения сразу всего массива задач используется метод Task.WaitAll()

      1. Работа с классом Task

Для создания и последующего запуска задачи можно использовать конструктор класса Task и затем его метод Start, либо класс TaskFactory.

Конструктор класса Task принимает в качестве параметра делегат Action или Action<object>. Таким образом, мы можем при вызове конструктора передать либо метод без параметров, либо метод с любым объектом.

Способы создания и запуска задач:

static void Main(string[] args)

{

Task task1 = new Task(()=>DisplayMessage("вызов метода с параметрами"));

task1.Start();

Task task2 = new Task(Display);

task2.Start();

Task task3 = new Task(() =>

{

Console.WriteLine("Id задачи: {0}", Task.CurrentId);

});

task3.Start();

Task task4 = Task.Factory.StartNew(() =>

{

Console.WriteLine("Id задачи: {0}", Task.CurrentId);

});

TaskFactory tf = new TaskFactory();

Task t5 = tf.StartNew(Display);

Console.ReadLine();

}

static void Display()

{

Console.WriteLine("Id задачи: {0}", Task.CurrentId);

}

static void DisplayMessage(string message)

{

Console.WriteLine("Сообщение: {0}", message);

Console.WriteLine("Id задачи: {0}", Task.CurrentId);

}

Задача task1 создается с помощью лямбда-выражения, в которое передается вызов метода с параметром. Так как метод может принимать любой объект, то в данном случае мы передаем в метод строку. Хотя мы также могли определить метод с параметром int и передавать в него число.

При создании задачи с помощью фабрики Task.Factory мы также передаем в метод Task.Factory.StartNew название метода или лямбда-выражение, только в данном случае метод StartNew сразу же и запускает задачу, поэтому нам не надо делать вызовtask4.Start

Последнее пример задачи аналогичен предыдущему, только использует класс фабрики задач TaskFactory