Проблема с выполнением потока - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, уважаемые! Подскажите, почему не работает в цикле новый поток.
Листинг программы
  1. List<string> Strs = new List<string> {
  2. "http://s.pikabu.ru/post_img/2013/10/20/10/1382281486_1883458322.jpg",
  3. "http://s.pikabu.ru/post_img/2013/10/05/8/1380976724_1830336456.jpg",
  4. "http://s.pikabu.ru/post_img/2013/09/25/6/1380096597_1548092731.jpg",
  5. "http://s.pikabu.ru/post_img/2013/08/06/5/1375770774_76736368.jpg",
  6. "http://s.pikabu.ru/post_img/2013/08/02/0/1375390515_1869417109.jpg",
  7. "http://s.pikabu.ru/post_img/2013/07/30/9/1375192700_1385045426.jpg"};
  8. Image[] ArrImages = new Image[Strs.Count];
  9. for (int i = 0; i < Strs.Count; i++)
  10. {
  11. new System.Threading.Thread(delegate() { GetImageFromUrl(Strs[i]); }).Start();
  12. }
Если убрать цикл, и оставить объявление нового потока, как показано ниже, то всё работает(скачивается указанная картинка):
Листинг программы
  1. string url = "http://s.pikabu.ru/post_img/2013/10/20/10/1382281486_1883458322.jpg";
  2. new System.Threading.Thread(delegate() { GetImageFromUrl(url); }).Start();
, Для полноты кода, вот процедура сохранения картинки:
Листинг программы
  1. public static void GetImageFromUrl(string url)
  2. {
  3. string Extension = System.IO.Path.GetExtension(url);
  4. string name = System.IO.Path.GetFileName(url);
  5. HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
  6. using (HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse())
  7. {
  8. using (Stream stream = httpWebReponse.GetResponseStream())
  9. {
  10. Image image = Image.FromStream(stream);
  11. image.Save(@"C:\Users\Илья\Desktop\TIProject\" + name + Extension);
  12. }
  13. }
  14. }

Решение задачи: «Проблема с выполнением потока»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5.  
  6. namespace ConsApp_Multithreading_UsingTasks
  7. {
  8.     class Program
  9.     {
  10.         // Блокирующая очередь. Сюда будут добавляться "логины" из ричбокса и отсюда их будут доставать обрабатывающие потоки
  11.         static BlockingCollection<int> queue = new BlockingCollection<int>();
  12.  
  13.         static void Main(string[] args)
  14.         {
  15.             // Создаем шесть потоков, которые будут заниматься логином
  16.             Task[] threads = new Task[6];
  17.             for (int i = 0; i < threads.Length; i++)
  18.             {
  19.                 int num = i + 1;
  20.                 threads[i] = Task.Factory.StartNew(() => ProcessQueue("Thread " + num));
  21.             }
  22.  
  23.             // Создаем очередь "логинов"
  24.             for (int i = 0; i < 100; i++)
  25.             {
  26.                 queue.Add(i);
  27.             }
  28.  
  29.             // Эта строчка заставит все слушающие потоки разблокироваться, когда в очереди не останется элементов.
  30.             // На деле ее надо добавлять при завершении работы приложения - чтобы слушающие потоки не висели бесконечно.
  31.             queue.CompleteAdding();
  32.  
  33.             // Ждем окончания работы всех потоков
  34.             Task.WaitAll(threads);
  35.  
  36.             Console.WriteLine("All threads finished execution");
  37.             Console.ReadLine();
  38.         }
  39.  
  40.         // Добавляет элемент в очередь
  41.         static void Enqueue(int value)
  42.         {
  43.             queue.Add(value);
  44.         }
  45.  
  46.         // Удаляет и возвращает первый элемент в очереди
  47.         static int Dequeue()
  48.         {
  49.             return queue.Take();
  50.         }
  51.  
  52.         // Достает элементы из очереди и обрабатывает их
  53.         static void ProcessQueue(object taskName)
  54.         {
  55.  
  56.             while (true)
  57.             {
  58.                 try
  59.                 {
  60.                     // Достаем следующий элемент из очереди. Если элементов ноль и свойство очереди IsCompleted = false, поток будет заблокирован пока элементы не появятся.
  61.                     int item = Dequeue();
  62.  
  63.                     // Делаем что нам нужно. В данном случае просто выводим полученный из очереди элемент в консоль. На деле здесь будут обрабатываться логины.
  64.                     Console.WriteLine("{0}: processing {1}.", taskName, item);
  65.  
  66.                     // Допустим, один логин занимает 1 секунду.
  67.                     Thread.Sleep(1000);
  68.                 }
  69.                 catch (InvalidOperationException)
  70.                 {
  71.                     // Обеспечиваем выход из бесконечного цикла при завершении работы приложения
  72.                     Console.WriteLine("{0} has finished working", taskName);
  73.                     return;
  74.                 }
  75.             }
  76.         }
  77.     }
  78. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы