згодом порівняти роботу програми з різною кількістю потоків і зробити відповідні висновки. Назвемо додаток downloader. br/>
.1 Структурна схема програми
На малюнку 1 показана структурна схема нашого застосування.
В
Рисунок 1 - Структурна схема програми downloader
3.2 Розробка і оптимізація коду програми на C #
Отже, потік - це послідовність команд програми, яка виконується паралельно з іншими потоками. Слід відзначити дві особливості потоків - по-перше вони можуть використовувати один і той же програмний код, і по-друге вони мають доступ до одних і тих же даних. p align="justify"> В якості даних у нас буде черга з URL адресов.Enqueue ("#" justify"> Загальний код - це код для завантаження чергової web сторінки:
WebRequest request = WebRequest.Create (URL); response = (HttpWebResponse) request.GetResponse (); HTML = (new StreamReader (response.GetResponseStream ())). ReadToEnd ();
Синхронізацію найлегше робити за допомогою оператора lock:
Object locker = new Object (); CriticalMethod ()
{
lock (locker)
{
// критична секція
// тут ми працюємо із загальними для потоків даними
}
}
Оператор lock приймає як аргумент об'єкт синхронізації locker і допускає всередину критичної секції тільки один потік, інші потоки підійшли до lock - чекають поки завершиться потік, що знаходиться всередині критичної секції. В якості об'єкта синхронізації може виступати будь-який створений (Не null) об'єкт посилального типу. p align="justify"> Перший варіант робочої програми виглядає так:
using System; System.Collections.Generic; System.Text; System.Threading; System.Net; System.IO; Downloader
{Program
{
// чергу адрес для закачкіQueue URLs = new Queue ();
// список викачаних страніцList HTMLs = new List ();
// локер для черги адресовobject URLlocker = new object ();
// локер для списку викачаних страніцobject HTMLlocker = new object (); void Main (string [] args)
{. Enqueue ("#" justify">// створюємо і запускаємо 3 потоку (int i = 0; i <3; i + +)
(new Thread (new ThreadStart (Download))). Start ();
// очікуємо натискання Enter.ReadLine ();
} static void Download ()
{
// будемо крутити цикл, поки не закінчаться ULR в черзі (true)
{URL;
// бло...