Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Створення додатків з розпаралелюванням задач.
На даній частині лабораторної роботи буде розглянутий процес створення простого додатку з використанням багатозадачності. 1. Створимо багатозадачний консольний додаток: Рисунок 5. – Вікно створення консольного додатку
Створимо статичний метод, який буде виводити на консоль повідомлення " 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()
Запустимо програму. Результат повинен виглядати наступним чином: Рисунок 6. – Вікно результату роботи програми
Модифікуємо програму. Змінимо метод 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)
Програма виведе наступний результат на екран:
Рисунок 7. – Результат виконання програми
Тепер, створимо нову задачу, з використанням методу ContinueWith. Даний метод викликає продовження виконання цільової задачі, але вже в іншій задачі, в нашому випадку задачі message:
Task cwt = message.ContinueWith(task => Console.WriteLine(" Сообщение: " + message.Result));
Запустимо додаток. Результат буде таким: Рисунок 8. – Результати роботи програми Примітка. Як видно з результату виконання програми, головний метод завершить виконання раніше, ніж дочірні задачі, це пов'язано з тим, що задача виведення на екран результату (Task cwt) виконання методу printMessage., виконається тільки тоді, коли завершиться виконання задачі Task < string> message. Для створення дочірніх задач використовуємо наступний фрагмент коду:
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()
Запустимо програму. В результаті на екрані відобразиться наступне:
|