Томский политехнический университет
Опубликован: 23.01.2013 | Доступ: свободный | Студентов: 1158 / 192 | Длительность: 12:09:00
Самостоятельная работа 3:

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

< Лекция 7 || Самостоятельная работа 3: 12 || Лекция 8 >

Parallel.Foreach

В данной части практического занятия будет разработано консольное приложение, которое скачивает содержание Web-страниц, в цикле foreach, и в цикле Parralel.Foreach.

  1. Создадим консольное приложение и назовем его, к примеру, ParallelForeachApplication
  2. Подключаем необходимые директивы:
    using System.Net;
    using System.Threading.Tasks;
  3. Инициализируем коллекцию ссылок 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"                             
        };
  4. Теперь, создадим цикл 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();
  5. Запустим программу. На экране отобразится результат выполнение алгоритма:
  6. Далее, создадим аналогичный цикл, который бы скачивал содержание 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();
  7. Запустим программу. В результате на экране отобразится следующее:

    Примечание. Цикл 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();        
    }    
            }
        }
< Лекция 7 || Самостоятельная работа 3: 12 || Лекция 8 >
Владимир Каширин
Владимир Каширин

Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010".

При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п.

Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010.