假设我有一个包含大约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方法,但我得到了相同的结果。我做错了什么?
答案 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)
有关此的一些细节。它建议var在这种情况下是可选的,但我很想尝试改变它,看看它是否有任何区别。
答案 2 :(得分:0)
我几乎每次都从第一个网址获得相同的下载字符串。
您是说temp
事件处理程序中DownloadStringKmlCompleted
的值几乎总是相同的,无论您从哪个网址下载?那将是非常意外的。
我建议您使用允许传递用户令牌的OpenReadAsync
重载,并将其传递给您请求的uri:
Wc.OpenReadAsync(varUri, varUri);
在事件处理程序中,您可以从事件args中的UserState
属性中获取该值:
Uri requestUri = (Uri)e.UserState;
然后,您可以将请求uri与收到的数据进行匹配。