Загрузка списка URL - PullRequest
       1

Загрузка списка URL

2 голосов
/ 27 октября 2011

Допустим, у меня есть список с около 300 URL, например:

List<string> url;

Я хочу загрузить весь контент со всех URL-адресов списка. Мое решение:

foreach (var k in url)
{
    WebClient Wc = new WebClient();
    Wc.OpenReadCompleted += new OpenReadCompletedEventHandler(DownloadStringKmlCompleted);
    Uri varUri = new Uri(k);
    Wc.OpenReadAsync(varUri);                
}

eventMethod:

void DownloadStringKmlCompleted(object sender, OpenReadCompletedEventArgs e)
{            
     StreamReader k = new StreamReader(e.Result);
     string temp = k.ReadToEnd();
     DoSomething(temp);  
}

Моя проблема: я получаю почти каждый раз одну и ту же строку из первого URL. Я также пытался использовать метод DownloadStringAsync, но у меня был тот же результат. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Это прекрасно работает для меня. Как вы заполняете свой список URL-адресов?

class Program
    {
        static void Main(string[] args)
        {
            Demo d = new Demo();
            d.Process();

            Console.ReadLine();
        }
    }

    class Demo
    {
        public void Process()
        {
            List<string> urls = new List<string>() { "http://www.google.com", "http://www.bing.com", "http://www.cnn.com", "http://www.engadget.com" };
            foreach (var url in urls)
            {
                WebClient Wc = new WebClient();
                Wc.OpenReadCompleted += new OpenReadCompletedEventHandler(DownloadStringKmlCompleted);
                Uri varUri = new Uri(url);
                Wc.OpenReadAsync(varUri, url);
            }
        }
        void DownloadStringKmlCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            StreamReader k = new StreamReader(e.Result);
            string temp = k.ReadToEnd();
            DoSomething(temp, e.UserState as string);
        }

         void DoSomething(string temp, string source)
        {
            Console.WriteLine(new string('*', 100));
             Console.WriteLine("Source: {0}, Data: {1}", source, temp.Substring(0, 1000));
        }
    }
0 голосов
/ 27 октября 2011

Я почти каждый раз получаю одну и ту же загруженную строку из первого URL.

Вы говорите, что значение temp в обработчике событий DownloadStringKmlCompleted почти всегдаТо же самое, независимо от того, с какого URL вы скачиваете?Это было бы совершенно неожиданно.

Я бы посоветовал вам использовать перегрузку OpenReadAsync, которая позволяет вам передавать токен пользователя и передавать ему запрошенный URI:

Wc.OpenReadAsync(varUri, varUri);

ваш обработчик событий, вы можете получить это значение из свойства UserState в аргументах события:

Uri requestUri = (Uri)e.UserState;

Затем вы можете сопоставить uri запроса с полученными данными.

0 голосов
/ 27 октября 2011

Действительно дикое предположение здесь ... у вас есть список строк, и вы используете var в цикле foreach.Что произойдет, если вы измените его на:

foreach (string k in url) 

Взгляните на эту страницу

, чтобы узнать подробнее об этом.Он предполагает, что var в этом случае необязателен, но мне было бы любопытно попробовать изменить его и посмотреть, будет ли он иметь какое-либо значение.

...