下载URL列表

时间:2011-10-27 15:29:58

标签: c# wpf asynchronous webclient

假设我有一个包含大约300个Url的列表,例如:

List<string> 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);  
}

我的问题是:我几乎每次都从第一个网址获得相同的下载字符串。我也尝试使用DownloadStringAsync方法,但我得到了相同的结果。我做错了什么?

3 个答案:

答案 0 :(得分:1)

这对我来说很好。你如何填写你的网址列表?

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));
        }
    }

答案 1 :(得分:0)

这里有一个真正疯狂的猜测......你有一个字符串列表,你在foreach循环中使用var。如果将其更改为:

会发生什么
foreach (string k in url) 

查看this page

有关此的一些细节。它建议var在这种情况下是可选的,但我很想尝试改变它,看看它是否有任何区别。

答案 2 :(得分:0)

  

我几乎每次都从第一个网址获得相同的下载字符串。

您是说temp事件处理程序中DownloadStringKmlCompleted的值几乎总是相同的,无论您从哪个网址下载?那将是非常意外的。

我建议您使用允许传递用户令牌的OpenReadAsync重载,并将其传递给您请求的uri:

Wc.OpenReadAsync(varUri, varUri);

在事件处理程序中,您可以从事件args中的UserState属性中获取该值:

Uri requestUri = (Uri)e.UserState;

然后,您可以将请求uri与收到的数据进行匹配。