Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Створення додатків з розпаралелюванням задач.






На даній частині лабораторної роботи буде розглянутий процес створення простого додатку з використанням багатозадачності.

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()

 

Запустимо програму. В результаті на екрані відобразиться наступне:


Рисунок 9. – Результати роботи програми

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал