使用HubConnection在SignalR中重新连接的正确逻辑

时间:2017-10-20 05:28:22

标签: c# connection signalr signalr.client

我需要将客户端应用程序(SignalR)重新连接到服务器应用程序(SignalR),直到连接完毕。

但它总是ConnectionState.Reconnecting ......所以我不知道如何重新连接。

我找到了这种方法Best practice for reconnecting SignalR 2.0 .NET client to server hub 说我们必须重新创建HubConnection作为一种独特的工作方法......

有任何线索吗?

我的代码是

System.Timers.Timer connectionChecker = new System.Timers.Timer(20000);
HubConnection Connection { get; set; }

private void  ConnectionChecker_ElapsedAsync(object sender, System.Timers.ElapsedEventArgs e)
{
    if (Connection.State == ConnectionState.Disconnected)
    {
        connectionChecker.Stop();
        ForceConnectAsync().Start(); // In this method await Connection.Start();
    }
    else if (Connection.State == ConnectionState.Connecting)
    {
        // After conection lost it keeps this state ALWAYS.
        // But once server is up it still has this state.
    }
    else if (Connection.State == ConnectionState.Reconnecting)
    {
    }
    else if (Connection.State == ConnectionState.Connected)
    {
    }
}

1 个答案:

答案 0 :(得分:0)

所以我找到了最酷的解决方案Best practice for reconnecting SignalR 2.0 .NET client to server hub

private async Task<bool> ConnectToSignalRServer()
{
    bool connected = false;
    try
    {
        Connection = new HubConnection("server url");
        Hub = Connection.CreateHubProxy("MyHub");
        await Connection.Start();

        //See @Oran Dennison's comment on @KingOfHypocrites's answer
        if (Connection.State == ConnectionState.Connected)
        {
            connected = true;
            Connection.Closed += Connection_Closed;
        }
        return connected;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error");
        return false;
    }
}

private async void Connection_Closed()
{
    if(!IsFormClosed) // A global variable being set in "Form_closing" event of Form, check if form not closed explicitly to prevent a possible deadlock.
    {
        // specify a retry duration
        TimeSpan retryDuration = TimeSpan.FromSeconds(30);

        while (DateTime.UtcNow < DateTime.UtcNow.Add(retryDuration))
        {
            bool connected = await ConnectToSignalRServer(UserId);
            if (connected)
                return;
        }
        Console.WriteLine("Connection closed")
    }
}