.net - 如何通过 .NET 中的线程传播 tcplistener 传入连接?

标签 .net multithreading tcplistener

使用 Net.Sockets.TcpListener 时,在单独的线程中处理传入连接 (.AcceptSocket) 的最佳方法是什么?

这个想法是在接受新的传入连接时启动一个新线程,而 tcplistener 然后保持可用于进一步传入连接(并且为每个新传入连接创建一个新线程)。与发起连接的客户端的所有通信和终止都将在线程中处理。

VB.NET 代码的示例 C# 值得赞赏。

最佳答案

我一直在使用的代码如下所示:

class Server
{
  private AutoResetEvent connectionWaitHandle = new AutoResetEvent(false);

  public void Start()
  {
    TcpListener listener = new TcpListener(IPAddress.Any, 5555);
    listener.Start();

    while(true)
    {
      IAsyncResult result =  listener.BeginAcceptTcpClient(HandleAsyncConnection, listener);
      connectionWaitHandle.WaitOne(); // Wait until a client has begun handling an event
      connectionWaitHandle.Reset(); // Reset wait handle or the loop goes as fast as it can (after first request)
    }
  }


  private void HandleAsyncConnection(IAsyncResult result)
  {
    TcpListener listener = (TcpListener)result.AsyncState;
    TcpClient client = listener.EndAcceptTcpClient(result);
    connectionWaitHandle.Set(); //Inform the main thread this connection is now handled

    //... Use your TcpClient here

    client.Close();
  }
}

关于.net - 如何通过 .NET 中的线程传播 tcplistener 传入连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62449/

相关文章:

c# - 线程有什么区别

c - 关于 _mm_clflush (void const* p)

C# 通过 HTTP 发送图像

.net - 我该如何解决?错误 : Select is not a member of 'System.Collections.Generic.List(Of String)'

c++ - 解释 Valgrind 输出以找出数据竞争的位置

c# - 我如何启动这样的自定义变量; "Serie S = new Serie() { 1, 2, 3, 4 }"?

c# - 与多个客户端的C#TCP/IP简单聊天

go - 在 golang 中的两个不同的 tcp 客户端之间中继数据

c# - 对 PInvoke 函数的调用使堆栈不平衡。这可能是因为托管 PInvoke .. (.NET 4)

c# - .NET 中的编码风格 : whether to refactor into new method or not?