C# 线程化HTTP Post应用程序
我有一个定期执行HTTP POST(从SQL检索的数据)的应用程序。每30秒最多生成50个线程并并发运行HTTP POST。如果post失败,只要间隔设置为,它将等待2倍的时间。这将发生两次。例如,30秒,60秒,然后120秒 我正在使用一个普通的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帖子的经验 话虽如此
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(…)进行异步操作,可能是一名代表。谢谢,我一定会在可能的时候研究这个问题。