2017-10-20 25 views
0

J'ai besoin de reconnecter l'application Client (SignalR) à l'application Serveur (SignalR) jusqu'à ce qu'elle soit connectée.Logique correcte pour se reconnecter dans SignalR avec HubConnection

Mais il a ConnectionState.Reconnecting toujours ... Donc je n'ai aucune idée comment se reconnecter.

J'ai trouvé cette approche Best practice for reconnecting SignalR 2.0 .NET client to server hub disant que nous devons recréer HubConnection comme une approche de travail unique ...

Un indice?

Le code que j'ai est

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) 
       { 
       } 
      } 
+0

double possible de [meilleures pratiques pour retrouver le contact SignalR .NET 2.0 client concentrateur serveur] (https://stackoverflow.com/questions/23375043/best-practice-for-reconnecting-signalr-2-0-net-client-to-server-hub) –

Répondre

0

Je trouve ce plus cool 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") 
    } 
}