C# 断开插座时,会出现等待时间

C# 断开插座时,会出现等待时间,c#,sockets,visual-studio-2013,asyncsocket,C#,Sockets,Visual Studio 2013,Asyncsocket,最近我在用C#学习网络和Windows窗体 我正在尝试构建一个异步套接字网络系统,一切正常 连接和连接回调的代码如下所示 private void ClientConnect() { CheckForIllegalCrossThreadCalls = false; try { socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), soc

最近我在用C#学习网络和Windows窗体

我正在尝试构建一个异步套接字网络系统,一切正常

连接和连接回调的代码如下所示

 private void ClientConnect()
    {
        CheckForIllegalCrossThreadCalls = false;

        try
        {
            socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), socket);

            connectDone.WaitOne();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    private void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);

            Send(socket, textBox3.Text, 0);

            connectDone.Set();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
private void btnDisconnect_Click(object sender, EventArgs e)
    {
        try
        {
            socket.Shutdown(SocketShutdown.Both);
            Application.DoEvents();
            socket.Disconnect(true);    //-> problem occurs.
        }
        catch
        {
            MessageBox.Show("Disconnect Error!");
        }

        if (socket.Connected)
            MessageBox.Show("Disconnect Error!");
        else
            textBox1.AppendText("Disconnected! (" + DateTime.Now.ToString("h:mm:ss tt") + ")\n");
    }
但在断开插座时,出现了一个问题

我制作了一个按钮来断开插座,下面是按钮点击事件的代码

 private void ClientConnect()
    {
        CheckForIllegalCrossThreadCalls = false;

        try
        {
            socket.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), socket);

            connectDone.WaitOne();
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    private void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);

            Send(socket, textBox3.Text, 0);

            connectDone.Set();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
private void btnDisconnect_Click(object sender, EventArgs e)
    {
        try
        {
            socket.Shutdown(SocketShutdown.Both);
            Application.DoEvents();
            socket.Disconnect(true);    //-> problem occurs.
        }
        catch
        {
            MessageBox.Show("Disconnect Error!");
        }

        if (socket.Connected)
            MessageBox.Show("Disconnect Error!");
        else
            textBox1.AppendText("Disconnected! (" + DateTime.Now.ToString("h:mm:ss tt") + ")\n");
    }
当我断开插座时,会有2分钟的等待时间

2分钟后(我用时间戳检查),它显示“断开连接”消息

我可以重新连接这个插座

我认为这不仅仅是像睡觉一样等待,有些事情是在后台处理的

(因为鼠标光标已更改,程序被阻止)

我很想知道为什么会发生这种延迟


请让我知道。

如果您想学习如何正确操作,请删除
CheckForIllegalCrossThreadCalls=false
Application.DoEvents()。这些都是解决方法。你需要阅读有关套接字编程的知识。正确的“优雅关闭”包括仅使用shutdown(send)来启动断开连接,然后等待接收操作以0字节计数完成。然后,断开连接将立即发生(假设远程端点写入正确)。按照您的操作方式,套接字会陷入等待状态,以确保防止数据丢失/损坏。正确断开连接后,不可能出现此类错误,并且可以立即关闭。@Peter Duniho您的意思是我必须将关机(两者)更改为关机(发送)?但我想增加接收消息的功能。和。。我放弃了一些同步(waitone/set),但仍在等待。有没有可能服务器程序对此有问题?“我必须将Shutdown(两者)更改为Shutdown(发送)?”--是的,这就是我的意思。但单凭这一点并不能解决你的问题。您仍然需要正确地处理远程端点,同时关闭套接字(通过看到接收操作完成且字节计数为0来检测)_“有没有可能服务器程序对此有问题?”--对不起,不清楚您所说的“这”是什么意思。但是假设服务器写得正确,那么当客户端代码也写得正确时,它就可以正常工作了。没问题。如果您想学习如何正确操作,请删除
CheckForIllegalCrossThreadCalls=false
Application.DoEvents()。这些都是解决方法。你需要阅读有关套接字编程的知识。正确的“优雅关闭”包括仅使用shutdown(send)来启动断开连接,然后等待接收操作以0字节计数完成。然后,断开连接将立即发生(假设远程端点写入正确)。按照您的操作方式,套接字会陷入等待状态,以确保防止数据丢失/损坏。正确断开连接后,不可能出现此类错误,并且可以立即关闭。@Peter Duniho您的意思是我必须将关机(两者)更改为关机(发送)?但我想增加接收消息的功能。和。。我放弃了一些同步(waitone/set),但仍在等待。有没有可能服务器程序对此有问题?“我必须将Shutdown(两者)更改为Shutdown(发送)?”--是的,这就是我的意思。但单凭这一点并不能解决你的问题。您仍然需要正确地处理远程端点,同时关闭套接字(通过看到接收操作完成且字节计数为0来检测)_“有没有可能服务器程序对此有问题?”--对不起,不清楚您所说的“这”是什么意思。但是假设服务器写得正确,那么当客户端代码也写得正确时,它就可以正常工作了。没问题。