private async Task ListenAsync() { try { var listenSessionTask = ListenSessionAsync(); var listenMessagesTask = ListenMessagesAsync(); var listenNotificationsTask = ListenNotificationsAsync(); var listenCommandsTask = ListenCommandsAsync(); var completedTask = await Task.WhenAny(listenSessionTask, listenMessagesTask, listenNotificationsTask, listenCommandsTask); if (completedTask != listenSessionTask) { await _clientChannel.SendFinishingSessionAsync(CancellationToken.None); await listenSessionTask; } } catch (OperationCanceledException) when(_cancellationTokenSource.IsCancellationRequested) { } catch (Exception ex) { ErrorMessage = ex.Message; } _clientChannel.DisposeIfDisposable(); Owner.ContentViewModel = _loginViewModel; }
public void Dispose() { _clientChannel?.DisposeIfDisposable(); _clientChannel = null; _semaphore?.DisposeIfDisposable(); _cts?.Dispose(); _disposed = true; }
public override async Task OnWindowClosingAsync() { if (_clientChannel != null) { if (_clientChannel.State == SessionState.Established) { await _clientChannel.SendFinishingSessionAsync(); var session = await _clientChannel.ReceiveFinishedSessionAsync(_receiveTimeout.ToCancellationToken()); } _clientChannel.DisposeIfDisposable(); } }
private async Task <IClientChannel> GetChannelAsync(CancellationToken cancellationToken, string operationName) { var channelCreated = false; var clientChannel = _clientChannel; while (ShouldCreateChannel(clientChannel)) { cancellationToken.ThrowIfCancellationRequested(); await _semaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { clientChannel = _clientChannel; if (ShouldCreateChannel(clientChannel)) { try { _cts?.Cancel(); _cts?.Dispose(); _clientChannel?.DisposeIfDisposable(); } catch { } finally { _cts = null; } clientChannel = _clientChannel = await _builder .BuildAndEstablishAsync(cancellationToken) .ConfigureAwait(false); _cts = new CancellationTokenSource(); _finishedSessionTask = clientChannel.ReceiveFinishedSessionAsync(_cts.Token); channelCreated = true; break; } } catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested) { throw; } catch (Exception ex) { var failedChannelInformation = new FailedChannelInformation( null, SessionState.New, null, null, false, ex, operationName); var handlers = ChannelCreationFailedHandlers.ToList(); if (!await InvokeHandlersAsync(handlers, failedChannelInformation, cancellationToken).ConfigureAwait(false)) { throw; } } finally { _semaphore.Release(); } } if (channelCreated && clientChannel != null) { var channelInformation = new ChannelInformation(clientChannel.SessionId, clientChannel.State, clientChannel.LocalNode, clientChannel.RemoteNode); var handlers = ChannelCreatedHandlers.ToList(); await InvokeHandlersAsync(handlers, channelInformation, cancellationToken).ConfigureAwait(false); } return(clientChannel); }