Основы параллельного программирования с использованием Visual Studio 2010

Создание приложения с распараллеливанием задач

Показывать лекцию целиком
  • Создадим многозадачное консольное приложение и назовем его, к примеру, "SimpleMultitaskingApplication": (рис 8.1)
  • Создадим статичный метод, который будет выводить на консоль сообщение "Hello world!":
    private static void printMessage() {
            Console.WriteLine("Hello world!");
        }
  • Создадим четыре различных задачи, различными способами:
    Task task1 = new Task(new Action(printMessage));
            Task task2 = new Task(delegate { Console.WriteLine("Hello world!"); });
            Task task3 = new Task(() => printMessage());
            Task task4 = new Task(() => { Console.WriteLine("Hello world!"); });
  • task1 - используем делегат Action и именной метод (в нашем случае printMessage);
  • task2 - используем анонимный делегат;
  • task3 - используем лямбда выражение и именной метод;
  • task4 - используем лямбда выражение и анонимный метод.
  • Запускаем задачи с помощью метода Start():
    task1.Start()
            task2.Start()
            task3.Start()
            task4.Start()
  • Обозначим завершение главного потока (метод Main()) с помощью фрагмента кода:
    Console.WriteLine("Главный метод завершен.")
            Console.ReadLine()

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace SimpleMultitaskingApplication
    {
        class Program
        {
        private static void printMessage() 
     {
            Console.WriteLine("Hello world!");
      	 }
            static void Main(string[] args)
            {
            Task task1 = new Task(new Action(printMessage));
            Task task2 = new Task(delegate { Console.WriteLine("Hello world!"); });
            Task task3 = new Task(() => printMessage());
            Task task4 = new Task(() => { Console.WriteLine("Hello world!"); });
            task1.Start();
            task2.Start();
            task3.Start();
            task4.Start();
            Console.WriteLine("Главный метод завершен.");
            Console.ReadLine();
       	 }
          }
        }
  • Запустим программу, результат выглядит следующим образом: (рис 8.2)
  • Модифицируем программу. Изменим метод printMessage():
    private static string printMessage(string message) 
        {
            return message.ToUpper();
        }

    Данный перегруженный метод теперь возвращает значение типа string, преобразованное в верхний регистр.

  • Создадим задачу, в методе Main, которая бы передавала в метод printMessage значение и возвращала результат выполнения задачи в виде строки:
    Task <string> message = new Task<string>(mes => printMessage((string) mes), "hello world")
            message.Start()
            Console.WriteLine("Сообщение: " + message.Result)
  • Запустим программу. Программа выведет следующий результат на экран: (рис 8.3)

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace SimpleMultitaskingApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                Task<string> message = new Task<string>(mes => printMessage((string)mes), "hello world");
                message.Start();
                Console.WriteLine("Сообщение: " + message.Result);
                Console.WriteLine("Главный метод завершен.");
                Console.ReadLine();
            }
        private static string printMessage(string message) 
        {
            return message.ToUpper();
        }
            }
        }
  • Теперь, создадим новую задачу, с использованием метода ContinueWith. Данный метод вызывает продолжение выполнения целевой задачи, но уже в другой задаче, в нашем случае задачи message:
    Task cwt =message.ContinueWith(task =>  Console.WriteLine("Сообщение: " + message.Result));
  • Запустим приложение. Результат будет следующим: (рис 8.4)

    Примечание. Как видно из результата выполнения программы, главный метод завершит выполнение раньше, чем дочерни задачи, это связанно с тем, что задача вывода на экран результата (Task cwt) выполнения метода printMessage., выполнится только тогда, когда завершится выполнение задачи Task <string> message.

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace SimpleMultitaskingApplication
    {
        class Program
        {
        private static string printMessage(string message) 
        {
            return message.ToUpper();
        }
            static void Main(string[] args)
            {
                Task<string> message = new Task<string>(mes => printMessage((string)mes), "hello world");
                message.Start();
                Task cwt = message.ContinueWith(task => Console.WriteLine("Сообщение: " + message.Result));
                Console.WriteLine("Главный метод завершен.");
                Console.ReadLine();
            }
            }
        }
  • Для создания дочерних задач используем следующий фрагмент кода:
    Task<string[]> message = new Task<string[]>(() =>
         {
             var result = new string[3];
             new Task(() => result[0] = printMessage("Hello"), TaskCreationOptions.AttachedToParent).Start();
             new Task(() => result[1] = printMessage("World"), TaskCreationOptions.AttachedToParent).Start();
             new Task(() => result[2] = printMessage("Hello world!"), TaskCreationOptions.AttachedToParent).Start();
             return result;
         });

    Данный фрагмент кода возвращает строковый массив, который формируется с помощью дочерних задач.

  • Теперь необходимо вывести строковый массив на экран с помощью фрагмента кода:
    var cwt =message.ContinueWith(mes =>  Array.ForEach(mes.Result,Console.WriteLine))
             message.Start()
  • Запустим программу. В результате на экране отобразится следующее: (рис 8.5)

    Листинг кода программы:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace SimpleMultitaskingApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                Task<string[]> message = new Task<string[]>(() =>
                    {
                        var result = new string[3];
                        new Task(() => result[0] = printMessage("Hello"), TaskCreationOptions.AttachedToParent).Start();
                        new Task(() => result[1] = printMessage("World"), TaskCreationOptions.AttachedToParent).Start();
                        new Task(() => result[2] = printMessage("Hello world!"), TaskCreationOptions.AttachedToParent).Start();
                        return result;
                    });
               var cwt =message.ContinueWith(mes =>  Array.ForEach(mes.Result,Console.WriteLine));
             message.Start();
            Console.WriteLine("Главный метод завершен.");
            Console.ReadLine();
            }
        private static string printMessage(string message) 
        {
            return message.ToUpper();
        }
            }
        }
  • Вернуться к учебному плану