我有一个应用程序,使API请求的last.fm网站使用的backgroundWorker。最初,我不知道我需要发出多少个请求。响应包含总页数,所以我只会在第一个请求之后获取它。下面是代码。
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
int page = 1;
int totalpages = 1;
while (page <= totalpages)
{
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
//Here is the request part
string Response = RecentTracksRequest(username, from, page);
if (Response.Contains("lfm status=\"ok"))
{
totalpages = Convert.ToInt32(Regex.Match(Response, @"totalPages=.(\d+)").Groups[1].Value);
MatchCollection match = Regex.Matches(Response, "<track>((.|\n)*?)</track>");
foreach (Match m in match)
ParseTrack(m.Groups[1].Value);
}
else
{
MessageBox.Show("Error sending the request.", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (page >= totalpages)
break;
if (totalpages == 0)
break;
if (page < totalpages)
page++;
}问题是last.fm应用程序接口真的很慢,可能需要5秒才能得到响应。对于大量的页面,加载将需要很长时间。
我想做并行请求,比方说一次3个并行请求。有可能吗?如果是,我怎样才能做到?
非常感谢。
发布于 2012-10-31 17:51:57
你可以利用HttpClient,假设你有一个urls列表:
var client = new HttpClient();
var tasks = urls.Select(url => client.GetAsync(url).ContinueWith(t =>
{
var response = t.Result;
response.EnsureSuccessStatusCode();
//Do something more
}));如果您使用异步方式,您可以等待所有任务完成,如下所示:
var results = await Task.WhenAll(tasks);发布于 2012-10-31 17:48:40
您也可以使用BeginGetResponse执行异步Web请求
HttpWebRequest webRequest;
webRequest.BeginGetResponse(new AsyncCallback(callbackfunc), null);
void callbackfunc(IAsyncResult response)
{
webRequest.EndGetResponse(response);
}https://stackoverflow.com/questions/13155052
复制相似问题