调用和管理多个http请求响应的最佳方式

本文关键字:响应 最佳 方式 请求 http 管理 调用 | 更新日期: 2023-09-27 18:29:02

我有一个挑战,我需要调用许多http请求并处理它们中的每一个。如何做到这一点,我不想等待从其中一个获得响应,然后调用下一个,如何为进程响应分配方法(如回调)。如何定义回调并分配给每个回调?

调用和管理多个http请求响应的最佳方式

您需要的是一个异步编程模型,在该模型中创建async任务,并在之后使用await关键字进行响应。

因此,从本质上讲,您并不是在等待第一个异步调用完成,您只需要根据自己的意愿启动尽可能多的异步任务,并等待只有在需要响应以继续执行程序逻辑时才得到响应。

有关更多详细信息,请查看以下内容:https://msdn.microsoft.com/en-us/library/hh696703.aspx

1)您可以调用该normaly(noneasync):

    public string TestNoneAsync()
    {
        var webClient = new WebClient();
        return webClient.DownloadString("http://www.google.com");
    }

2) 可以使用APM(异步):

    private void SpecAPI()
    {
        var req = (HttpWebRequest)WebRequest.Create("http://www.google.com");
        //req.Method = "HEAD";
        req.BeginGetResponse(
            asyncResult =>
            {
                var resp = (HttpWebResponse)req.EndGetResponse(asyncResult);
                var headersText = formatHeaders(resp.Headers);
                Console.WriteLine(headersText);
            }, null);
    }
    private string formatHeaders(WebHeaderCollection headers)
    {
        var headerString = headers.Keys.Cast<string>()
                                  .Select(header => string.Format("{0}:{1}", header, headers[header]));
        return string.Join(Environment.NewLine, headerString.ToArray());
    }

3) 您可以创建一个回调并对其进行签名,EAP。(async.net 2):

    public void EAPAsync()
    {
        var webClient = new WebClient();
        webClient.DownloadStringAsync(new Uri("http://www.google.com"));
        webClient.DownloadStringCompleted += webClientDownloadStringCompleted;
    }
    void webClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        // use e.Result
        Console.WriteLine("download completed callback.");
    }

4) 您可以使用更新的方式TAP、cleare方式(c#5)。建议:

    public async Task<string> DownloadAsync(string url)
    {
        var webClient = new WebClient();
        return await webClient.DownloadStringTaskAsync(url);
    }
    public void DownloadAsyncHandler()
    {
        //DownloadAsync("http://www.google.com");
    }

这个解决方案中的线程不是一个好方法。(许多挂起调用http请求的线程!)