我正在尝试对API进行负载测试。我正在同时执行一个任务,每个任务都执行一个HTTP请求。我Task.WhenAll(mytasks)
用于等待所有任务完成。请求如下所示:
using (var response = await client.SendAsync(request).ConfigureAwait(false))
{
using (var jsonResponse = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
var jsonSerializer = new DataContractJsonSerializer(typeof(Borders));
var borders = (Borders)jsonSerializer.ReadObject(jsonResponse);
return borders;
}
}
至少可以处理多达数千个任务。但是,如果我开始更多,那么我会遇到几千个任务HttpRequestExceptions
:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)
--- End of inner exception stack trace ---
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at BusinessLogic.<GetBorder>d__6d.MoveNext() in c:\BusinessLogic.cs:line 757
所以我的问题是:为什么会发生这种情况(有1000多个任务)?我该如何预防呢?我显然可以将任务块切成小于1000的块,但我想将其留给底层系统...
我想把它留给底层系统...
那不是一个好主意。.NET Framework在确定IO的最佳并行度方面的能力为零。
并行发出多个请求通常不是一个好主意,因为此处强调的资源可能在此之前已用完。显然,您的后端服务器无法处理这种程度的并行性。它会根据消息强行切断您的联系。
仅仅因为我们现在有了简单的异步IO,await
并不意味着您可以使用1000个并行请求来向您的资源发送垃圾邮件。
使用一种常见的解决方案来执行一系列具有一定并行度的异步操作。我喜欢http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx,但也有基于的解决方案ActionBlock
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句