Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 线程化HTTP Post应用程序_C#_Performance_Multithreading - Fatal编程技术网

C# 线程化HTTP Post应用程序

C# 线程化HTTP Post应用程序,c#,performance,multithreading,C#,Performance,Multithreading,我有一个定期执行HTTP POST(从SQL检索的数据)的应用程序。每30秒最多生成50个线程并并发运行HTTP POST。如果post失败,只要间隔设置为,它将等待2倍的时间。这将发生两次。例如,30秒,60秒,然后120秒 我正在使用一个普通的Thread.Start()来启动这个进程,但是我发现在实时服务器上,它完全消除了CPU 我的问题如下: 是否有更好的类用于线程性能 有没有办法限制.NET中线程应用程序的CPU使用率 谢谢 Kyle很抱歉,我没有多线程HTTP帖子的经验 话虽如此

我有一个定期执行HTTP POST(从SQL检索的数据)的应用程序。每30秒最多生成50个线程并并发运行HTTP POST。如果post失败,只要间隔设置为,它将等待2倍的时间。这将发生两次。例如,30秒,60秒,然后120秒

我正在使用一个普通的
Thread.Start()
来启动这个进程,但是我发现在实时服务器上,它完全消除了CPU

我的问题如下:

  • 是否有更好的类用于线程性能
  • 有没有办法限制.NET中线程应用程序的CPU使用率
谢谢


Kyle

很抱歉,我没有多线程HTTP帖子的经验

话虽如此,您使用哪个类进行HTTP post?
我想,它应该有方法以异步方式进行HTTPPOST


而且,如果这不起作用,您可以使用ThreadPool而不是创建自己的线程。

真的有必要让50个线程同时运行吗


只需将生成的线程数量限制为10个线程,然后分批运行即可。

您不应该使用线程来运行多个I/O流。由于这些线程主要在I/O上阻塞,因此可以使用非阻塞或异步I/O更有效地实现这一点。与使用一个线程与一台服务器对话不同,使用一个线程与N台服务器对话


由于您使用的是HttpWebRequest,因此您需要查看并使用线程池。

通常,使用线程池

在每个.NET进程中都有一个线程池,一个随时可以为您工作的线程池。你应该用它

原因,原因,原因,原因

简短的故事是:与当前按需启动线程的方法相比,它的效率更高,而且对CPU更友好

.NET还有一个evry易于使用的机制,用于将工作发送到线程池中的线程:

我不知道.NET线程池是如何在内部管理的,但我知道比我聪明的工程师已经完成了分析工作,以确定它应该做什么,应该包含多少线程,以及它应该如何运行以避免CPU被淹没。是的,它是专门为避免您描述的问题而设计的。如果线程池对于ASPNET worker进程足够好,那么对于我的应用程序可能足够好


还有你的。

我想知道,你运行的CPU性能可能会受到影响(例如低效的监视循环),或者是因为内存耗尽而导致页面文件抖动问题。如果您的工人类有大量本地数据,则可以相当快地吸收内存

我使用HttpWebRequest做了类似的事情,已经能够在飞行中同时有大约100个连接,但在这一点上,我已经最大限度地利用了网络带宽和内存,尽管50个连接运行良好。我创建自己的线程,而不是使用线程池,因为我使用回调,所以我可以轻松跟踪线程状态,甚至在需要时中止线程。它还简化了从失败连接重新启动的过程——我只是将线程抛出回挂起的线程队列中


线程池有助于防止您启动过多线程,但我认为线程创建开销与网络连接响应延迟相比微不足道,至少在我的经验中是这样。

您的重试逻辑有缺陷,它应该比时间间隔小,否则它会排到无穷远:)恐怕需要这样。它只会在当前批完全排序后运行下一批,因此它不会无限期运行。我不能使用异步post,因为我需要返回。它使用普通的旧HttpWebRequest来做文章。在这种情况下,ThreadPool将为我提供什么好处?您可以在请求中使用异步。您可以在.NET中的任何委托上执行BeginInvoke(),这使您有机会在HttpWebRequest上使用异步。关于为什么要使用线程池,请参阅我的答案。我同意…我在考虑通过.BeginInvoke(…)进行异步操作,可能是一名代表。谢谢,我一定会在可能的时候研究这个问题。