public async Task <EConnectionResult> WaitForLogin(bool reconnect = false, CancellationToken cancellationToken = default) { try { // the login semaphore only allows one login attempt simultaneously await _loginSemaphore.WaitAsync(cancellationToken); // check if we are already connected if (!reconnect && _connectionStatus == EConnectionResult.Connected) { return(EConnectionResult.Connected); } _connectionStatus = EConnectionResult.Connecting; // var connectionResult = EConnectionResult.Disconnected; var retryStarted = false; while (_connectionStatus != EConnectionResult.Connected) { _connectionStatus = await LoginAsync(retryStarted, cancellationToken); switch (_connectionStatus) { case EConnectionResult.InvalidCredentials: _logger.LogWarning("Invalid credentials... terminating service."); var applicationLifetime = _host.Services.GetService <IHostApplicationLifetime>(); applicationLifetime.StopApplication(); return(EConnectionResult.InvalidCredentials); case EConnectionResult.InvalidLocation: if (!retryStarted) { _logger.LogWarning("Invalid location... web server might be down... retrying..."); } break; case EConnectionResult.Connected: break; default: if (!retryStarted) { _logger.LogWarning($"Error: Login returned {_connectionStatus}.. retrying..."); } break; } await Task.Delay(5000, cancellationToken); retryStarted = true; } } finally { try { _loginSemaphore.Release(); } catch (ObjectDisposedException) {} } return(EConnectionResult.Connected); }
public void ResetConnection() { _connectionStatus = EConnectionResult.Disconnected; }