public void ProcessCurrentState(IDownloader downloader, IUploader uploader) { if (!_timersManager.CheckTimerTimeout(DISABLE_UPLOAD_TIMER_NAME)) { _uploadEnabled = true; } if (_stream.IsInFaultState && !_stream.Reopen()) { Thread.Sleep(_lowLevelSettings.ConnectionRetryTime); return; } switch (_state) { case DataLinkStates.Upload: try { _uploader.ExecuteUploadStep(); if (_uploader.Completed) { disableUpload(_lowLevelSettings.DelayUploadAfterUpload); _state = DataLinkStates.Neutral; raiseMessageUploadCompleted(new IOMessageEventArgs(_uploader.Message)); } } catch (DataLinkLayerException ex) { _log.LogError(ex.Message); if (ex.InnerException is ContentionErrorException) { _downloader.Reset(); _state = DataLinkStates.Download; } else { disableUpload(_lowLevelSettings.DelayUploadAfterUploadError); _state = DataLinkStates.Neutral; raiseMessageUploadCompleted(new IOMessageEventArgs(_uploader.Message, ex)); } } break; case DataLinkStates.Download: try { _downloader.ExecuteDownloadStep(); if (_downloader.Completed) { disableUpload(_lowLevelSettings.DelayUploadAfterDownload); _state = DataLinkStates.Neutral; raiseMessageDownloadCompleted(new IOMessageEventArgs(_downloader.Message)); } } catch (TimeoutException) { // The Data Link in the neutral state _state = DataLinkStates.Neutral; } catch (DataLinkLayerException ex) { _log.LogError(ex.Message); _state = DataLinkStates.Neutral; raiseMessageDownloadCompleted(new IOMessageEventArgs(_downloader.Message, ex)); } break; case DataLinkStates.Neutral: if (_uploadQueue.Count > 0 && _uploadEnabled) { var message = ""; lock (_uploadQueue) { message = _uploadQueue.Dequeue(); } _uploader.ResetAndUpload(message); _state = DataLinkStates.Upload; } else { _downloader.Reset(); _state = DataLinkStates.Download; } break; } }