我的WPF应用程序使用SignalR .Net Client在本地运行,以使用异步代码连接到SignalR集线器。
我想解决SignalR集线器关闭的情况,并且当SignalR集线器在例如10分钟后重新联机时,WPF应用程序会自动重新连接。我想在HubConnection关闭事件中注册异步操作。自动SignalR重新连接逻辑非常棒但是当超时超时时,它仍应重新连接到集线器。该示例使用Polly在连接关闭后重试直到成功。
以下代码的问题在于无法控制异步操作(HubConnectionClosedEventHandler),并且在关闭WPF应用程序时,它不会正确处理这些正在运行的任务。 Log4Net在几次重试后也会停止记录这种奇怪的行为。向关闭事件注册异步操作以尝试重新连接的最佳做法是什么?我做错了什么?
private async Task InitializeAsync()
{
this.hubConnection.Closed += this.HubConnectionClosedEventHandler();
}
private Action HubConnectionClosedEventHandler()
{
return () => this.HubConnectionClosed().Wait();
}
private async Task HubConnectionClosed()
{
App.LogDebug("Connection closed event triggered.");
await this.StartSignalRConnection();
}
private async Task StartSignalRConnection()
{
App.LogDebug("Initialize policy.");
var policy = Policy.Handle<Exception>().WaitAndRetryForeverAsync(retryAttempt => TimeSpan.FromSeconds(2));
await policy.ExecuteAsync(this.StartSignalRConnectionAsync);
}
private async Task StartSignalRConnectionAsync()
{
App.LogDebug("Start connection.");
await this.hubConnection.Start()
.ContinueWith(
task =>
{
if (task.Exception != null || task.IsFaulted)
{
var exceptionMessage =
$"There was an error opening the connection with connection '{CustomSettings.CallcenterHubConnection}'";
App.LogError(exceptionMessage,
task.Exception);
throw new InvalidOperationException(exceptionMessage);
}
App.LogDebug(
$"Connected successfully with connection '{CustomSettings.CallcenterHubConnection}'");
});
}
public void Stop()
{
try
{
this.hubConnection.Closed -= this.HubConnectionClosedEventHandler();
if (this.hubConnection.State != ConnectionState.Disconnected) this.hubConnection.Stop();
}
catch (Exception ex)
{
App.LogError("Exception when stopping", ex);
}
}
答案 0 :(得分:0)
似乎劫持重新连接的已关闭事件是错误的。最后,我们最终将断开连接超时更改为5分钟,并使用断开连接图标可视化WPF工具。如果服务器有一些严重问题并且已修复,则用户手动必须重新启动WPF工具。