Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步vs线程用于大规模、低延迟http请求_C#_Multithreading_Http_Asynchronous_Synchronous - Fatal编程技术网

C# 异步vs线程用于大规模、低延迟http请求

C# 异步vs线程用于大规模、低延迟http请求,c#,multithreading,http,asynchronous,synchronous,C#,Multithreading,Http,Asynchronous,Synchronous,我需要做大量HTTP(对于金融应用程序,主机不提供更好的API)请求(大约每秒800)和处理他们的响应(JSON,通常不超过1kb大)(只进行反序列化和比较一些值)最后根据响应发出另一个请求(响应和下一个请求之间的时间不应超过1-2 ms) 目前,我使用同步请求的传统线程,其中大约50%的线程仅在40-60秒后执行请求,而另外50%的线程始终在请求 虽然这种方法在每秒50-100个请求的情况下工作得很好,但我体验到,在每秒800个请求的情况下,线程的响应和下一个请求之间的时间太长(通常为50-2

我需要做大量HTTP(对于金融应用程序,主机不提供更好的API)请求(大约每秒800)和处理他们的响应(JSON,通常不超过1kb大)(只进行反序列化和比较一些值)最后根据响应发出另一个请求(响应和下一个请求之间的时间不应超过1-2 ms

目前,我使用同步请求的传统线程,其中大约50%的线程仅在40-60秒后执行请求,而另外50%的线程始终在请求
虽然这种方法在每秒50-100个请求的情况下工作得很好,但我体验到,在每秒800个请求的情况下,线程的响应和下一个请求之间的时间太长(通常为50-200ms)

当我想解决这个问题时,我想问:

1。异步操作是更好的方法吗? 阅读大量有关异步获得可伸缩性和响应能力的信息,但不确定它是否有利于低延迟(上下文切换、任务创建等开销)
2。我能把线拧一拧吗?(独立于Quest#1)我在想,当线程当前处理响应时,给线程更高的优先级(超过
.ThreadPriority
),但这并没有真正起作用/可能在处理时完全停止其他线程的执行
(3.我应该使用哪个HTTP请求类/库?当前使用的是
HttpWebRequest
s,它比我测试中的
HttpClient
要快一点,或者我应该使用其他什么?


任何帮助都将不胜感激

我经历并解决了这个问题(从服务器并行下载大量XML文件),根据我的经验,使用异步大约快20%-50%,具体取决于文件的大小

不幸的是,这是几个月前的事了,但我在每个请求中都使用了WebClient,只做了一个WebClient.DownloadString,所以如果这是您的用例,它可能适合您


真正的答案是:尝试这两种方法并对其进行分析。在两者之间切换应该不难

根据我的经验,
System.Net.Http.HttpClient
的性能足以满足您的需要。其中一个挑战是设置并行连接的数量。您不能直接使用
HttpWebRequest.ConnectionLimit
属性,因此必须通过
ServicePointManager

ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri);
servicePoint.ConnectionLimit = connectionLimit;

您可以使用任务来执行并行操作,并在“<代码>任务”的情况下等待结果。当所有的< /代码> ./P>之前,服务器是否支持在高吞吐量(800 Req/SEC)下的响应时间?您也可以考虑水平缩放这一点——也许像MSMQ这样的排队系统会对您有所裨益,当客户端从队列中跨越其他物理机器时。强烈建议使用TPL数据流进行这种类型的工作。这是一个相当可怕的速度。首先,您需要确保您和源之间的每一点网络都可以处理它。根据我的经验,SOHO路由器在达到这样的速率之前就已经耗尽了资源,而且肯定是异步的。如上所述,请考虑TPL数据流。这是处理这种高吞吐量应用程序的一种非常酷的方式。