вторник, 23 августа 2011 г.

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 - вступление"

Комментариев нет:

Отправить комментарий