1

backgroundWorkerを使用してlast.fmWebサイトに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, "<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 APIが非常に遅く、応答を取得するのに最大5秒かかる可能性があることです。ページ数が多いと、読み込みに時間がかかります。

並列リクエストを作成したいのですが、たとえば一度に3つの並列リクエストを作成します。出来ますか?はいの場合、どうすればそれを作ることができますか?

どうもありがとう。

4

2 に答える 2

10

HttpClientURLのリストがあると仮定して、を利用できます。

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-31T09:51:57.033 に答える
2

BeginGetResponseを使用して、非同期Webリクエストを実行することもできます

      HttpWebRequest webRequest;
      webRequest.BeginGetResponse(new AsyncCallback(callbackfunc), null);


      void callbackfunc(IAsyncResult response)
      {
         webRequest.EndGetResponse(response);
      }
于 2012-10-31T09:48:40.460 に答える