并行http请求
我有一个应用程序,使用backgroundWorker向last.fm网站发出API请求。 最初我不知道我需要做多少请求。 响应包含总页数,因此我只会在第一次请求后得到它。 这是下面的代码。
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, ""); 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 API非常慢,最多可能需要5秒才能获得响应。 对于大量页面,加载将花费很长时间。
我想做并行请求,一次说3个并行请求。 可能吗? 如果是的话,我该怎么做呢?
非常感谢。
你可以利用HttpClient
,假设你有url列表:
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);
您也可以使用BeginGetResponse执行异步Web请求
HttpWebRequest webRequest; webRequest.BeginGetResponse(new AsyncCallback(callbackfunc), null); void callbackfunc(IAsyncResult response) { webRequest.EndGetResponse(response); }