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

问题描述:

我需要将客户端应用程序(SignalR)重新连接到服务器应用程序(SignalR),直到它连接。用HubConnection在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) 
       { 
       } 
      } 
+0

[重新连接SignalR 2.0 .NET客户机到服务器集线器最佳实践]的可能的复制(HTTPS:/ /*.com/questions/23375043/best-practice-for-reconnecting-signalr-2-0-net-client-to-server-hub) –

所以我发现这个最冷溶液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") 
    } 
}