如何优化C#异步调用

时间:2014-03-07 20:50:37

标签: c# api rest asynchronous async-await

我是C#的异步世界的新手,并且无疑对这个主题没有太多的了解。我只需要在我们的一个服务中实现它,我对它的工作原理有点困惑。我想尽可能快地发布到API。我不太关心获得响应需要多长时间并用它做些什么。这是我正在做的一个例子。

        foreach (var item in list)
        {
            callPostFunction(item.data);
            log("Posted");
        }

    public async void callPostFunction(PostData data)
    {
        var apiResult = await postToAPI(data);
        updateDB(apiResult);
    }

    public static async Task<string> postToAPI(PostData dataToSend)
    {
        var url = "Example.com";

        HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(url);
        ASCIIEncoding encoding = new ASCIIEncoding();
        string postData = dataToSend;
        byte[] dataBytes = encoding.GetBytes(postData);

        httpWReq.Method = "POST";
        httpWReq.ContentType = "application/x-www-form-urlencoded";
        httpWReq.ContentLength = dataBytes.Length;
        httpWReq.Accept = "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml";

        using (var stream = await httpWReq.GetRequestStreamAsync())
        {
            await stream.WriteAsync(dataBytes, 0, dataBytes.Length);
        }

        HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();

        return new StreamReader(response.GetResponseStream()).ReadToEnd();
    }

如果我在列表中放入1000个项目会发生什么,“已发布”会立即记录1000次。很好,这个过程已经完成,可以继续做其他事情。问题是在后台的某个地方callPostFunction调用postToAPI并发布到API,它可以工作,但需要很长时间。它需要与实现异步之前一样长(尽管不长)。我觉得我错过了什么。

我必须快速点击API。理想情况下,我想在调用callPostFunction时几乎立即调用它。我该怎么做呢?

2 个答案:

答案 0 :(得分:4)

你没有错过任何东西。发布一堆数据需要时间。网络连接很慢。它们的带宽有限。异步执行此工作不是速度的灵丹妙药。它的目的也不是为了优化速度。

答案 1 :(得分:4)

ServicePointManager.DefaultConnectionLimit设为int.MaxValue

另外,正如@Servy指出的那样,避免使用async void