用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)
{
}
}
答
所以我发现这个最冷溶液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")
}
}
[重新连接SignalR 2.0 .NET客户机到服务器集线器最佳实践]的可能的复制(HTTPS:/ /stackoverflow.com/questions/23375043/best-practice-for-reconnecting-signalr-2-0-net-client-to-server-hub) –