Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010". При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п. Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010. |
Томский политехнический университет
Опубликован: 23.01.2013 | Доступ: свободный | Студентов: 1157 / 192 | Длительность: 12:09:00
Тема: Программирование
Специальности: Программист, Архитектор программного обеспечения
Теги:
Самостоятельная работа 3:
Создание приложения с распараллеливанием данных
Parallel.Foreach
В данной части практического занятия будет разработано консольное приложение, которое скачивает содержание Web-страниц, в цикле foreach, и в цикле Parralel.Foreach.
- Создадим консольное приложение и назовем его, к примеру, ParallelForeachApplication
- Подключаем необходимые директивы:
using System.Net; using System.Threading.Tasks;
- Инициализируем коллекцию ссылок List<string>:
List<string> urls = new List<string>() {"http://intuit.ru", "http://rbc.ru", "http://ozon.ru", "http://google.com", "http://mail.ru", "http://lenta.ru" };
- Теперь, создадим цикл foreach, в котором бы скачивалась содержание Web-страниц, определенные в списке List<string>:
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); foreach (string url in urls) { WebClient client = new WebClient(); Console.WriteLine("Скачиваем : {0}" , url); client.DownloadString(url); } long elapsed = sw.ElapsedMilliseconds; Console.WriteLine("Затраченное время в миллисекундах: {0}",elapsed); sw.Stop();
- Запустим программу. На экране отобразится результат выполнение алгоритма:
- Далее, создадим аналогичный цикл, который бы скачивал содержание Web-страниц, но в параллельном режиме:
Console.WriteLine("============================"); sw.Restart(); Parallel.ForEach(urls, url => { WebClient client = new WebClient(); Console.WriteLine("Скачиваем : " + url); client.DownloadString(url); }); elapsed = sw.ElapsedMilliseconds; Console.WriteLine("Затраченное время в миллисекундах: {0}", elapsed); sw.Stop(); Console.ReadLine();
- Запустим программу. В результате на экране отобразится следующее:
Примечание. Цикл Parallel.Foreach, будет выполняться значительно быстрее т.к. методы, прописанные внутри тела цикла, будут выполняться в несколько потоков.
Листинг кода программы:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Net; using System.Threading.Tasks; namespace ParallelForeachApplication { class Program { static void Main(string[] args) { List<string> urls = new List<string>() { "http://intuit.ru", "http://rbc.ru", "http://ozon.ru", "http://google.com", "http://mail.ru", "http://lenta.ru" }; System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); foreach (string url in urls) { WebClient client = new WebClient(); Console.WriteLine("Скачиваем : {0}" , url); client.DownloadString(url); } long elapsed = sw.ElapsedMilliseconds; Console.WriteLine("Затраченное время в миллисекундах: {0}",elapsed); sw.Stop(); Console.WriteLine("============================"); sw.Restart(); Parallel.ForEach(urls, url => { WebClient client = new WebClient(); Console.WriteLine("Скачиваем : " + url); client.DownloadString(url); }); elapsed = sw.ElapsedMilliseconds; Console.WriteLine("Затраченное время в миллисекундах: {0}", elapsed); sw.Stop(); Console.ReadLine(); } } }