我是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时几乎立即调用它。我该怎么做呢?
答案 0 :(得分:4)
你没有错过任何东西。发布一堆数据需要时间。网络连接很慢。它们的带宽有限。异步执行此工作不是速度的灵丹妙药。它的目的也不是为了优化速度。
答案 1 :(得分:4)
将ServicePointManager.DefaultConnectionLimit
设为int.MaxValue
。
另外,正如@Servy指出的那样,避免使用async void
。