1

I need to reconnect Client app (SignalR) to the Server app (SignalR) until it is connected.

But it has ConnectionState.Reconnecting always... So I have no clue how to reconnect.

I found this approach Best practice for reconnecting SignalR 2.0 .NET client to server hub saying we have to recreate HubConnection as a unique working approach...

Any clue?

The code I have is

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)
    {
    }
}
Vincent P
  • 426
  • 3
  • 16
NoWar
  • 36,338
  • 80
  • 323
  • 498
  • Possible duplicate of [Best practice for reconnecting SignalR 2.0 .NET client to server hub](https://stackoverflow.com/questions/23375043/best-practice-for-reconnecting-signalr-2-0-net-client-to-server-hub) – NoWar Oct 20 '17 at 05:51

1 Answers1

3

So I found this coolest solution 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")
    }
}
NoWar
  • 36,338
  • 80
  • 323
  • 498