Задача: нужно получить результат выполнения параллельно выполняющихся задач.
Решение: создайте задачи (объекты типа Task) путем вызова статического метода System.Threading.Task<>.Factory.StartNew. Используйте свойство Task.Result для получения результата выполнения ваших задач.
Примечание: Метод StartNew создает и сразу же запускает задачу на выполнение. Если вам нужно создать задачи и запустить их позже, вы можете создать экземпляры класса Task через конструктор и запустить их, используя метод Start.
Пример кода.
Используемые пространства имен:
Тестовый класс:
Примерный результат выполнения:
День недели: Понедельник
Месяц: Янв
Месяц: Фев
День недели: Вторник
Месяц: Мар
День недели: Среда
Город: Москва
День недели: Четверг
Месяц: Апр
Город: Лондон
День недели: Пятница
Месяц: Май
Город: Шанхай
Месяц: Июн
День недели: Суббота
Город: Стокгольм
Месяц: Июл
День недели: Воскресенье
Город: Таллинн
Месяц: Авг
7 дней - это результат, полученный из задачи (!)
Месяц: Сен
Месяц: Окт
Месяц: Ноя
Месяц: Дек
12 месяцев - это результат, полученный из задачи (!)
5 городов - это результат, полученный из задачи (!)
Источник: "C# 2010 Recipes - A Problem Solution Approach" Allen Jones and Adam Freeman.
Предыдущая статья: "Parallel Programming - вступление"
Решение: создайте задачи (объекты типа Task) путем вызова статического метода System.Threading.Task<>.Factory.StartNew. Используйте свойство Task.Result для получения результата выполнения ваших задач.
Примечание: Метод StartNew создает и сразу же запускает задачу на выполнение. Если вам нужно создать задачи и запустить их позже, вы можете создать экземпляры класса Task через конструктор и запустить их, используя метод Start.
Пример кода.
Используемые пространства имен:
using System.Threading; using System.Threading.Tasks;
Тестовый класс:
public class ReturnResultTest
{
private int WriteDays()
{
string[] daysArray = {
"Понедельник",
"Вторник",
"Среда",
"Четверг",
"Пятница",
"Суббота",
"Воскресенье"
};
foreach (string day in daysArray)
{
Console.WriteLine("День недели: {0}", day);
// подвешиваем текущий поток и даем возможность отработать другим потокам
Thread.Sleep(500);
}
return daysArray.Length;
}
private int WriteMonths()
{
string[] monthsArray =
{
"Янв", "Фев", "Мар", "Апр",
"Май", "Июн", "Июл", "Авг",
"Сен", "Окт", "Ноя", "Дек"
};
foreach (string month in monthsArray)
{
Console.WriteLine("Месяц: {0}", month);
// подвешиваем текущий поток и даем возможность отработать другим потокам
Thread.Sleep(500);
}
return monthsArray.Length;
}
private int WriteCities()
{
string[] citiesArray = { "Москва", "Лондон", "Шанхай", "Стокгольм", "Таллинн" };
foreach (string city in citiesArray)
{
Console.WriteLine("Город: {0}", city);
// подвешиваем текущий поток и даем возможность отработать другим потокам
Thread.Sleep(500);
}
return citiesArray.Length;
}
public void StartTest()
{
// при каждом вызове StartNew запускается новая задача
Task<int> task1 = Task<int>.Factory.StartNew(WriteDays);
Task<int> task2 = Task<int>.Factory.StartNew(WriteMonths);
Task<int> task3 = Task<int>.Factory.StartNew(WriteCities);
// Получаем результат от задач
// При каждом вызове свойства Result, текущий поток подвисает
// до получения результата из задачи
Console.WriteLine("{0} дней", task1.Result);
Console.WriteLine("{0} месяцев", task2.Result);
Console.WriteLine("{0} городов", task3.Result);
}
}
Примерный результат выполнения:
День недели: Понедельник
Месяц: Янв
Месяц: Фев
День недели: Вторник
Месяц: Мар
День недели: Среда
Город: Москва
День недели: Четверг
Месяц: Апр
Город: Лондон
День недели: Пятница
Месяц: Май
Город: Шанхай
Месяц: Июн
День недели: Суббота
Город: Стокгольм
Месяц: Июл
День недели: Воскресенье
Город: Таллинн
Месяц: Авг
7 дней - это результат, полученный из задачи (!)
Месяц: Сен
Месяц: Окт
Месяц: Ноя
Месяц: Дек
12 месяцев - это результат, полученный из задачи (!)
5 городов - это результат, полученный из задачи (!)
Источник: "C# 2010 Recipes - A Problem Solution Approach" Allen Jones and Adam Freeman.
Предыдущая статья: "Parallel Programming - вступление"
Комментариев нет:
Отправить комментарий