Example #1
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        private async Task DoReconnect()
        {
#pragma warning disable 4014
            Task.Run(async() =>
            {
                _tokenSource.Cancel();
                _reconnecting = true;
                if (!Task.WaitAll(new[] { _monitorTask, _listenerTask, _senderTask }, 15000))
                {
                    // exit everything as dead...
                    OnFatality?.Invoke("Fatal network error. Network services fail to shut down.");
                    _reconnecting     = false;
                    _disconnectCalled = true;
                    _tokenSource.Cancel();
                    return;
                }
                _ws.Dispose();

                OnStateChanged?.Invoke(WebSocketState.Connecting, WebSocketState.Aborted);

                _tokenSource = new CancellationTokenSource();

                var connected = false;
                while (!_disconnectCalled && !_disposedValue && !connected && !_tokenSource.IsCancellationRequested)
                {
                    try
                    {
                        _ws = new ClientWebSocket();
                        if (!_monitorRunning)
                        {
                            StartMonitor();
                        }
                        connected = _ws.ConnectAsync(new Uri(Url), _tokenSource.Token).Wait(15000);
                    }
                    catch
                    {
                        _ws.Dispose();
                        Thread.Sleep(_reconnectStrategy.GetReconnectInterval());
                        _reconnectStrategy.ProcessValues();
                        if (_reconnectStrategy.AreAttemptsComplete())
                        {
                            // exit everything as dead...
                            OnFatality?.Invoke("Fatal network error. Max reconnect attemps reached.");
                            _reconnecting     = false;
                            _disconnectCalled = true;
                            _tokenSource.Cancel();
                            return;
                        }
                    }
                }
                if (connected)
                {
                    _reconnecting = false;
                    if (!_monitorRunning)
                    {
                        StartMonitor();
                    }
                    if (!_listenerRunning)
                    {
                        StartListener();
                    }
                    if (!_senderRunning)
                    {
                        StartSender();
                    }
                }
            });
#pragma warning restore 4014
        }
Example #2
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        private async Task DoReconnect()
        {
#pragma warning disable 4014
            Log("Entered reconnect.");
            Task.Run(async() =>
            {
                _tokenSource.Cancel();
                _reconnecting = true;
                if (!Task.WaitAll(new[] { _monitorTask, _listenerTask, _senderTask }, 15000))
                {
                    Log("Reconnect fatality, tasks failed to stop before the timeout.");
                    // exit everything as dead...
                    OnFatality?.Invoke("Fatal network error. Network services fail to shut down.");
                    _reconnecting     = false;
                    _disconnectCalled = true;
                    _tokenSource.Cancel();
                    return;
                }
                Log("Disposing of current websocket.");
                _ws.Dispose();

                OnStateChanged?.Invoke(WebSocketState.Connecting, WebSocketState.Aborted);

                _tokenSource = new CancellationTokenSource();

                var connected = false;
                while (!_disconnectCalled && !_disposedValue && !connected && !_tokenSource.IsCancellationRequested)
                {
                    try
                    {
                        Log("Creating new websocket.");
                        InitializeClient();
                        if (!_monitorRunning)
                        {
                            Log("Starting monitor.");
                            StartMonitor();
                        }
                        Log("Attempting connect.");
                        connected = _ws.ConnectAsync(new Uri(Url), _tokenSource.Token).Wait(15000);
                        Log($"Connect result: {connected}");
                    }
                    catch (Exception ex)
                    {
                        Log($"Reconnect threw an error: {ex.Message}.");
                        Log("Disposing of current websocket.");
                        _ws.Dispose();
                        Log("Processing reconnect strategy.");
                        Thread.Sleep(_reconnectStrategy.GetReconnectInterval());
                        _reconnectStrategy.ProcessValues();
                        if (_reconnectStrategy.AreAttemptsComplete())
                        {
                            Log("Reconnect strategy has reached max connection attempts, going to fatality.");
                            // exit everything as dead...
                            OnFatality?.Invoke("Fatal network error. Max reconnect attemps reached.");
                            _reconnecting     = false;
                            _disconnectCalled = true;
                            _tokenSource.Cancel();
                            return;
                        }
                    }
                }
                if (connected)
                {
                    Log("Reconnect success, restarting tasks.");
                    _reconnecting = false;
                    if (!_monitorRunning)
                    {
                        StartMonitor();
                    }
                    if (!_listenerRunning)
                    {
                        StartListener();
                    }
                    if (!_senderRunning)
                    {
                        StartSender();
                    }
                }
                else
                {
                    Log("Reconnect failed.");
                }
            });
#pragma warning restore 4014
        }