首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行http请求

并行http请求
EN

Stack Overflow用户
提问于 2012-10-31 17:42:03
回答 2查看 7.5K关注 0票数 1

我有一个应用程序,使API请求的last.fm网站使用的backgroundWorker。最初,我不知道我需要发出多少个请求。响应包含总页数,所以我只会在第一个请求之后获取它。下面是代码。

代码语言:javascript
复制
    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个并行请求。有可能吗?如果是,我怎样才能做到?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-31 17:51:57

你可以利用HttpClient,假设你有一个urls列表:

代码语言:javascript
复制
var client = new HttpClient();
var tasks = urls.Select(url => client.GetAsync(url).ContinueWith(t =>
            {
                var response = t.Result;
                response.EnsureSuccessStatusCode();

                //Do something more
            }));

如果您使用异步方式,您可以等待所有任务完成,如下所示:

代码语言:javascript
复制
var results = await Task.WhenAll(tasks);
票数 10
EN

Stack Overflow用户

发布于 2012-10-31 17:48:40

您也可以使用BeginGetResponse执行异步Web请求

代码语言:javascript
复制
      HttpWebRequest webRequest;
      webRequest.BeginGetResponse(new AsyncCallback(callbackfunc), null);


      void callbackfunc(IAsyncResult response)
      {
         webRequest.EndGetResponse(response);
      }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13155052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档