Проблема с выполнением потока - 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;
- }
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д