Проблема с выполнением потока - C#
Формулировка задачи:
Доброго времени суток, уважаемые!
Подскажите, почему не работает в цикле новый поток.
Если убрать цикл, и оставить объявление нового потока, как показано ниже, то всё работает(скачивается указанная картинка):
,
Для полноты кода, вот процедура сохранения картинки:
List<string> Strs = new List<string> { "http://s.pikabu.ru/post_img/2013/10/20/10/1382281486_1883458322.jpg", "http://s.pikabu.ru/post_img/2013/10/05/8/1380976724_1830336456.jpg", "http://s.pikabu.ru/post_img/2013/09/25/6/1380096597_1548092731.jpg", "http://s.pikabu.ru/post_img/2013/08/06/5/1375770774_76736368.jpg", "http://s.pikabu.ru/post_img/2013/08/02/0/1375390515_1869417109.jpg", "http://s.pikabu.ru/post_img/2013/07/30/9/1375192700_1385045426.jpg"}; Image[] ArrImages = new Image[Strs.Count]; for (int i = 0; i < Strs.Count; i++) { new System.Threading.Thread(delegate() { GetImageFromUrl(Strs[i]); }).Start(); }
string url = "http://s.pikabu.ru/post_img/2013/10/20/10/1382281486_1883458322.jpg"; new System.Threading.Thread(delegate() { GetImageFromUrl(url); }).Start();
public static void GetImageFromUrl(string url) { string Extension = System.IO.Path.GetExtension(url); string name = System.IO.Path.GetFileName(url); HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); using (HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (Stream stream = httpWebReponse.GetResponseStream()) { Image image = Image.FromStream(stream); image.Save(@"C:\Users\Илья\Desktop\TIProject\" + name + Extension); } } }
Решение задачи: «Проблема с выполнением потока»
textual
Листинг программы
using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; namespace ConsApp_Multithreading_UsingTasks { class Program { // Блокирующая очередь. Сюда будут добавляться "логины" из ричбокса и отсюда их будут доставать обрабатывающие потоки static BlockingCollection<int> queue = new BlockingCollection<int>(); static void Main(string[] args) { // Создаем шесть потоков, которые будут заниматься логином Task[] threads = new Task[6]; for (int i = 0; i < threads.Length; i++) { int num = i + 1; threads[i] = Task.Factory.StartNew(() => ProcessQueue("Thread " + num)); } // Создаем очередь "логинов" for (int i = 0; i < 100; i++) { queue.Add(i); } // Эта строчка заставит все слушающие потоки разблокироваться, когда в очереди не останется элементов. // На деле ее надо добавлять при завершении работы приложения - чтобы слушающие потоки не висели бесконечно. queue.CompleteAdding(); // Ждем окончания работы всех потоков Task.WaitAll(threads); Console.WriteLine("All threads finished execution"); Console.ReadLine(); } // Добавляет элемент в очередь static void Enqueue(int value) { queue.Add(value); } // Удаляет и возвращает первый элемент в очереди static int Dequeue() { return queue.Take(); } // Достает элементы из очереди и обрабатывает их static void ProcessQueue(object taskName) { while (true) { try { // Достаем следующий элемент из очереди. Если элементов ноль и свойство очереди IsCompleted = false, поток будет заблокирован пока элементы не появятся. int item = Dequeue(); // Делаем что нам нужно. В данном случае просто выводим полученный из очереди элемент в консоль. На деле здесь будут обрабатываться логины. Console.WriteLine("{0}: processing {1}.", taskName, item); // Допустим, один логин занимает 1 секунду. Thread.Sleep(1000); } catch (InvalidOperationException) { // Обеспечиваем выход из бесконечного цикла при завершении работы приложения Console.WriteLine("{0} has finished working", taskName); return; } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д