线程HTTP后期应用程序

时间:2010-01-22 05:41:24

标签: c# performance multithreading

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

我正在使用普通Thread.Start()来推动这个过程,但我发现在实时服务器上,它完全消灭了CPU。

我的问题如下:

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

谢谢,

凯尔

5 个答案:

答案 0 :(得分:1)

您不应该使用线程来运行多个I / O流。由于这些线程主要是阻塞I / O,因此您可以更有效地使用非阻塞或异步I / O.不是让一个线程与一个服务器通话,而是与N个服务器进行一次线程通话。

由于您使用的是HttpWebRequest,因此您需要查看HttpWebRequest.BeginGetResponseHttpWebRequest.BeginGetRequestStream

答案 1 :(得分:1)

通常,使用ThreadPool

在每个.NET进程中都有一个线程池,一个准备好为你工作的线程池。你应该使用它。

出于原因,请参阅Thread vs ThreadPoolThe .NET ThreadPool

简短的故事是:它比你现有的按需启动线程的方法更有效率,而且它对你的CPU更有利。

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

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

也是你的。

答案 2 :(得分:0)

对不起,我对多线程HTTP帖子没有任何经验。

话虽如此,你使用哪个类用于HTTP帖子?
我想,它应该有以异步方式进行HTTP post的方法。

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

答案 3 :(得分:0)

是否真的有必要同时运行50个线程?

尝试限制生成的线程数量,只需10个线程,然后批量运行。

答案 4 :(得分:0)

我想知道你还有什么可能运行那些破坏性的CPU性能(例如效率低下的监控循环),或者它是否是一个页面文件抖动问题,因为你已经耗尽了内存。如果你的工人类有很多本地数据,你可以很快地吸收内存。

我已经使用HttpWebRequest做了类似的事情,并且能够在飞行中同时拥有大约100个同时连接,但此时我已经最大化了网络带宽和内存,尽管50个连接运行正常。我创建自己的线程而不是使用ThreadPool,因为我使用回调,因此我可以轻松跟踪线程状态,甚至在需要时中止线程。它还简化了从失败的连接重新启动 - 我只是将线程放回到挂起的线程队列中。

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