我需要将客户端应用程序(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)
{
}
}
答案 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")
}
}