c#检测ClientWebSocket何时断开(关闭)

c#检测ClientWebSocket何时断开(关闭),c#,networking,connection,clientwebsocket,system.net.websockets,C#,Networking,Connection,Clientwebsocket,System.net.websockets,经过长时间的寻找,我来找你帮助我 我有一个WPF应用程序,使用ClientWebSocket类(使用System.Net.WebSocket)连接到WebSocket服务器(NodeJS)。我的应用程序正在运行Background windows应用程序,它第一次连接,然后在1分钟内尝试重新连接(如果尚未连接)。但是当我禁用connexion(网络连接)时,我的应用程序没有检测到这一点,所以evry 1分钟告诉我它已连接。我知道我的代码中有错误,我不知道如何实现一个事件处理程序,以便在连接丢失(

经过长时间的寻找,我来找你帮助我

我有一个WPF应用程序,使用ClientWebSocket类(使用System.Net.WebSocket)连接到WebSocket服务器(NodeJS)。我的应用程序正在运行Background windows应用程序,它第一次连接,然后在1分钟内尝试重新连接(如果尚未连接)。但是当我禁用connexion(网络连接)时,我的应用程序没有检测到这一点,所以evry 1分钟告诉我它已连接。我知道我的代码中有错误,我不知道如何实现一个事件处理程序,以便在连接丢失(websocket关闭)时得到通知

我注意到,当我连接到服务器时,我必须创建一个会话,然后我收到一个会话id,现在我连接到websocket服务器

Class1是一个libreary类,我使用WebSockets类

class1
{
    ClientWebSocket web_socket;
    bool connected = false;
    public async Task<bool> connect_socket()
    { 
        Object result_object;
        string session_id;
        try
        {
            if (connected == false)
            {
                web_socket = new ClientWebSocket();
                web_socket.Options.SetRequestHeader("headername", "headerValue");
                await web_socket.ConnectAsync(new Uri(" ... uri....."), CancellationToken.None);

                create_session();

                ArraySegment<byte> byte_received = new ArraySegment<byte>(new byte[1024]);
                WebSocketReceiveResult json_notify_result = await web_socket.ReceiveAsync(byte_received, CancellationToken.None);
                string string_notify = Encoding.UTF8.GetString(byte_received.Array);
                json_notify = JsonConvert.DeserializeObject<Dictionary<string, object>>(string_notify);

                if (json_notify.TryGetValue("result", out result_object))
                {
                    var result = JsonConvert.DeserializeObject<Dictionary<string, string>>((result_object).ToString());
                    if (result.TryGetValue("session_id", out session_id) && (string)session_id != null)
                        Debug.WriteLine("session_id = " + session_id);
                }
                 connected = true;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
         return connected;
    }
}
如有任何建议,我将不胜感激。
我真的陷入了这一点

您正在使用System.Threading.Timer,它正在线程池线程上运行Timer\u回调。因此,计时器回调中抛出的任何异常都将被吞没。所以当您断开连接时,
web\u socket.ConnectAsync
引发的异常也将被吞没

同时尝试检查套接字关闭消息

 var res = await webSocket.ReceiveAsync(segment, cancellation);
 if (res.MessageType == WebSocketMessageType.Close)
     return false;

我解决了我的问题,所以我回答了自己的问题。通过将“finaly”添加到“connect_socket”方法的try catch:

“状态”是一个变量,a用它来代替“已连接”,它的值为:closed、connecting、connected。在第二个类“Class2”中,我尝试在状态为“关闭”时连接


谢谢你的回答,你能给我解释一下吗?我在哪里可以测试WebSocketMessageType是否为Close?检查消息是否为Close类型实际上是防止崩溃和调用重新打开连接的一种非常好的方法。
 var res = await webSocket.ReceiveAsync(segment, cancellation);
 if (res.MessageType == WebSocketMessageType.Close)
     return false;
finally
            {
                Debug.WriteLine("\n"+ "Dispose websocket");
                if (web_socket != null)
                    web_socket.Dispose();
                state = WebsocketState.closed;
                session_id = null;
                Debug.WriteLine("\n" + "state of websocket is : " + state);
            }
if (Class1.state == "closed")
        {
            Class1.connect_socket().Wait();
        }