示例#1
0
        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;
 }
示例#3
0
        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();
            }
        }
示例#4
0
        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);
        }