WebClient класс на С# и многопоточность.

Тема в разделе "Другие языки", создана пользователем bolyk, 15 ноя 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. bolyk

    bolyk

    Регистр.:
    21 авг 2006
    Сообщения:
    308
    Симпатии:
    206
    Доброго времени суток, Обрыл кучу информации, так ничего для новичка в .net так и нашел. Помогите пожалуйста реализовать.:bc:
    Конкретно, нужно загрузить одновременно несколько страниц(любые). Очень бы хотелось увидеть примеры. Чем проше, тем лучше.
    Про DownloadStringAsync читал, так и не понял сути реализации. Огромнейшая просьба помогите пожалуйста.:thenks:
     
  2. ShoxMaster

    ShoxMaster

    Регистр.:
    3 дек 2008
    Сообщения:
    393
    Симпатии:
    150
    Зачем именно синхронно через потоки? Реализация по-очереди проще:
    string[] URL = { "http://ya.ru", "http://google.com" };
    foreach (string StrReq in URL)
    {
    WebRequest request = WebRequest.Create(StrReq);
    request.Credentials = CredentialCache.DefaultCredentials;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Console.WriteLine(response.StatusDescription);
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();
    Console.WriteLine(responseFromServer);
    reader.Close();
    dataStream.Close();
    response.Close();
    }
     
    bolyk нравится это.
  3. Lucid_Mind

    Lucid_Mind Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    72
    Симпатии:
    34

    Код:
    //Этот код нужно добавить в какой-то класс. :-)
    //Это объявляет в классе список потоков
    List<Thread> threads = new List<Thread>();
    //Это список, куда положатся значения скачанных страниц.
    List<string> contents = new List<string>();
    //Тут будут храниться УРЛы, которые нужно скачать.
    List<string> urls = new List<string>();
    public void StartDownloading()
    {
     //Этот код добавляет УРЛы в список для скачивания.
     urls.Add("http://ya.ru/");
     urls.Add("http://google.ru/");
     urls.Add("http://rambler.ru/");
     urls.Add("http://nigma.ru/");
     //Определяем количество УРЛов, которое должно быть скачано.
     int urlCount = urls.Count;
     //Этот код поместить в функцию, откуда всё запускается.
     for(int i = 0; i<10; i++)
     {
      ThreadStart ts = new ThreadStart(myFunc);
      Thread th = new Thread(ts);
      threads.Add(th);
      threads[threads.Count-1].Start();
     }
     //Этот код ждёт, пока все потоки не завершат свою работу
     while(true)
     {
      //Пока количество скачанных УРЛов не будет равно изначально заданному.
      if(contents.Count != urlCount)
      {
       //Чтобы программа не висла - обрабатываем сообщения приложения. Объявление Application находится в неймспейсе System.Windows.Forms.
       Application.DoEvents();
      }
      else
       break;
     }
     //Тут обработка скачанных страниц.
     //bla-bla-bla
    }
    //myFunc - функция, которая, собственно, скачивает страницы.
    private void myFunc()
    {
     try
     {
      //Если скачали уже всё - значит просто выходим из функции.
      if(urls.Count == 0)
        return;
      string url = "";
      lock(urls)
      {
       url = urls[0];
       url.RemoveAt(0);
      }
      WebClient wc = new WebClient();
      StreamReader sr = new StreamReader(wc.OpenRead(url));
      string content = sr.ReadToEnd();
      sr.Close();
      //
      //Лочим список, добавляем туда скачанную страницу.
      lock(contents)
      {
       contents.Add(content);
      }
     }
     catch(Exception ex)
     {
       //Если вызвано исключение - добавляем в список пустую строку.
       lock(contents)
       {
        contents.Add("");
       }
     }
    }
    
    --
    Не гарантирую то, что код скомпилируется, т.к. писал на память без студии, но смысл должен быть понятен.
    Но вродебвы, если добавтиь все ссылки и using, то всё должно скомпилироваться.
     
    bolyk нравится это.
  4. bolyk

    bolyk

    Регистр.:
    21 авг 2006
    Сообщения:
    308
    Симпатии:
    206
    Для себя набросал вот что-то такое, образное. Но что-то во мне говорит что это бредокод:D:
    PHP:
        int kollinkov 99;
      
    int kolpotokov 10;
       
      for (
    int i 0int u=0i<=(kollinkov-1))
      {
                  
    WebClient client = new WebClient();
                  
    byte[] bytes[i] =client.DownloadData(“links[i])
                    ...
    //тут обработка контента//

                  
    if (u==(kolpotokov-1))
                  {
                  
    i++;
                  
    u=0;
                  
    continiue;
                  }
                  
    u++;
                  
    i++;
      }
      
     
  5. Lucid_Mind

    Lucid_Mind Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    72
    Симпатии:
    34
    bolyk:
    1. Это пипец, я еле разобрался - что ты имел ввиду.
    2. Всё это дело у тебя как ни крути - будет работать в один поток.
    3. Ну и то, что ты хотел сделать - у тебя получилось неправильно. :)
    ---
    Почитай в сторону System.Threading.
    У тебя client.DownloadData - синхронная функция, т.е. пока она не отработает - у тебя программа дальше не пойдёт. Так что все твои потуги сделать это дело многопоточным бесполезны.
    ---
    Прочитай внимательно мой код, там вроде как всё правильно. :)
     
    bolyk нравится это.
  6. bolyk

    bolyk

    Регистр.:
    21 авг 2006
    Сообщения:
    308
    Симпатии:
    206
    Я уже интегрировал Ваш код, спасибо. Приятно получать советы от компетентных людей, тем более от разраба "негра":)
     
  7. Lucid_Mind

    Lucid_Mind Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    72
    Симпатии:
    34
    На здоровье, тем более - я просто набираю посты. :)
    Будут вопросы по C# и .NET - обращайся ко мне в АСЬку. :)
     
Статус темы:
Закрыта.