代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

TCP接受循环的线程类型:BackgroundWorker、Thread或ThreadPool

  •  0
  • Clinton Pierce  · 技术社区  · 14 年前

    我正在编写一个TCP服务器,它的核心是一个相当标准的bind-listen-accept代码,它被 TcpListener . 我正在开发中运行的代码 作品

            // Set up the socket listener
            // *THIS* is running on a System.Threading.Thread, of course.
            tpcListener = new TcpListener(IPAddress.Any, myPort);
            tpcListener.Start();
            while (true)
            {
                Socket so = tpcListener.AcceptSocket();
                try
                {
                    MyWorkUnit work = new MyWorkUnit(so);
                    BackgroundWorker bw = new BackgroundWorker();
                    bw.DoWork += new DoWorkEventHandler(DispatchWork);
                    bw.RunWorkerCompleted += 
                                    new RunWorkerCompletedEventHandler(SendReply);
                    bw.RunWorkerAsync(work);
                }
                catch (System.Exception ex)
                {
                    EventLogging.WindowsLog("Error caught: " + 
                                         ex.Message, EventLogging.EventType.Error);
                }
            }
    

    backgroundworker-vs-background-thread (第二个答案)。在上面的示例代码中,我选择了BackgroundWorker,因为它很简单。是时候弄清楚这是不是 正确的 做这件事的方式。

    • 不是Windows窗体应用程序。实际上,它是作为Windows服务运行的。
    • 只要 Accept() 循环得到循环。
    • 我以后不需要线程的固定ID Abort()
    • 线程中运行的任务很短,最多只有几秒钟。
    • 可能有很多任务会很快进入这个循环。
    • 如果我的线程用完了,那么拒绝(或排队)新工作的“优雅”方式会很好。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Henk Holterman    14 年前

    创建它的成本在这里并不重要,而且您(可能)希望完全控制线程的属性。

    编辑

    对于传入的请求,可以使用线程池(直接或通过Bgw),但请注意,这可能会影响吞吐量。当所有线程都很忙时,在创建额外线程之前会有一个延迟(0.5秒)。这种线程池行为可能有用,也可能不有用。您可以调整MinThreads来控制它。

    这很粗糙,但是如果你要为派生的任务创建你自己的线程,你可能必须想出你自己的节流机制。

    这完全取决于你期望的请求数量,以及它们的大小。

        2
  •  1
  •   Andrew Barber Eric Lafortune    14 年前

        3
  •  0
  •   Brian Gideon    14 年前

    嗯,就我个人而言,这些都不是我的首选。我倾向于通过利用异步IO操作 Socket.BeginReceive Socket.BeginSend ThreadPool 或者 Task (如果使用.NET4.0)将是下一个最佳选择。