代码之家  ›  专栏  ›  技术社区  ›  Kyle Rosendo

线程化HTTP Post应用程序

  •  2
  • Kyle Rosendo  · 技术社区  · 16 年前

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

    Thread.Start() 然而,为了让这个过程顺利进行,我发现在实时服务器上,它完全消除了CPU。

    我的问题如下:

    • 是否有更好的类用于线程性能?

    谢谢

    5 回复  |  直到 16 年前
        1
  •  1
  •   R Samuel Klatchko    16 年前

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

    由于您使用的是HttpWebRequest,您需要查看 HttpWebRequest.BeginGetResponse 和 HttpWebRequest.BeginGetRequestStream .

        2
  •  1
  •   Community Mohan Dere    9 年前

    一般来说 .

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

    有关原因,请参见 Thread vs ThreadPool 或 The .NET ThreadPool

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

    明确地

    还有你的。

        3
  •  0
  •   shahkalpesh    16 年前

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


    我想,它应该有方法以异步方式进行HTTPPOST。

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

        4
  •  0
  •   mark vanzuela    16 年前

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

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

        5
  •  0
  •   Ed Power    16 年前

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

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