SignalR .Net客户端异步重新连接

时间:2017-06-18 12:37:45

标签: c# .net wpf asynchronous signalr.client

我的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);
    }
}

1 个答案:

答案 0 :(得分:0)

似乎劫持重新连接的已关闭事件是错误的。最后,我们最终将断开连接超时更改为5分钟,并使用断开连接图标可视化WPF工具。如果服务器有一些严重问题并且已修复,则用户手动必须重新启动WPF工具。