C# TcpListener在重新连接时冻结

C# TcpListener在重新连接时冻结,c#,tcplistener,C#,Tcplistener,我正在使用TcpListener接收消息。我们的一个客户遇到问题,侦听器在收到消息后偶尔无法重新连接。我的重新连接代码非常基本,并且直接来自TcpListenerAPI tcpClientConnected = new ManualResetEvent(false); server = new TcpListener(IPAddress.Any, Port); server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOption

我正在使用TcpListener接收消息。我们的一个客户遇到问题,侦听器在收到消息后偶尔无法重新连接。我的重新连接代码非常基本,并且直接来自TcpListenerAPI

tcpClientConnected = new ManualResetEvent(false);
server = new TcpListener(IPAddress.Any, Port);
server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
server.Start();

while (isListening)
{
    Parent.Log("******************** WAITING FOR A MESSAGE ********************", Verbose.Debug);
    tcpClientConnected.Reset();
    server.BeginAcceptTcpClient(new AsyncCallback(AcceptMessage), server);
    tcpClientConnected.WaitOne();   //  Wait for an incoming message
    if(isListening)
        Parent.Log("******************** CONNECTION RESET ********************", Verbose.Debug);
    else
        Parent.Log("******************** LISTENER DISCONNECTED ********************", Verbose.Debug);
}
由于日志记录,我知道会调用
tcpClientConnected.Set()
。IsListening仍然为true,代码循环回BeginAcceptTcpClient。AcceptMessage中的第一行代码会写入日志,并且不会命中。因此,我知道从未收到新消息,并且服务器会锁定

此客户可以成功运行几天,然后锁定。这只发生在单个客户身上。在我的AcceptMessage代码中,我使用以下语句:

TcpListener listener = (TcpListener)ar.AsyncState;
using (TcpClient client = listener.EndAcceptTcpClient(ar))
using (NetworkStream stream = client.GetStream())
创建客户端后,我不引用侦听器。在这段代码中,我允许使用多缓冲区消息,但我不认为是其中的任何内容导致了这个问题


我的问题是,为什么BeginAcceptTcpClient没有连接,我可以做些什么来检测这个问题,并在需要时让它再试一次吗?

你能把它做成一个完整的样本,我们(和你)可以用它来重现这个问题吗?缺少重要的详细信息,例如在调用
server.BeginAcceptTcpClient
之前和之后如何创建、初始化和修改
server
对象。tcpClientConnected还会发生什么情况。你甚至还没有把他们的类型信息。我不想猜测这是一个
ManualResetEvent
@Vikhram-谢谢你看这个。对不起,我没有足够的信息;我试着只放需要的东西。你是对的,我应该添加构造函数。我不认为我需要更多的AcceptMessage部分,它有数百行,但如果有帮助的话,我可以添加它。如果您只是要等待
手动重置事件
,为什么要使用
BeginAcceptTcpClient
?为什么不直接使用
acceptcpclient
?我没有看到任何明显的错误,至少在提供的代码中是这样。如果我是你,我会使用同步的
Accept
调用,因为你正在对你的调用进行排序。你能把它做成一个完整的示例,我们(和你)可以用它来重现这个问题吗?缺少重要的详细信息,例如在调用
server.BeginAcceptTcpClient
之前和之后如何创建、初始化和修改
server
对象。tcpClientConnected还会发生什么情况。你甚至还没有把他们的类型信息。我不想猜测这是一个
ManualResetEvent
@Vikhram-谢谢你看这个。对不起,我没有足够的信息;我试着只放需要的东西。你是对的,我应该添加构造函数。我不认为我需要更多的AcceptMessage部分,它有数百行,但如果有帮助的话,我可以添加它。如果您只是要等待
手动重置事件
,为什么要使用
BeginAcceptTcpClient
?为什么不直接使用
acceptcpclient
?我没有看到任何明显的错误,至少在提供的代码中是这样。如果我是你,我会使用同步的
Accept
调用,因为你正在对调用进行排序。