私のWPFアプリケーションは、SignalR .Net Clientを使用してローカルで実行され、非同期コードでSignalRハブに接続しています。SignalR .Netクライアント非同期再接続
SignalRハブがダウンし、たとえば10分後にSignalRハブがオンラインに戻ったときに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);
}
}