public void Disconnect(Socket localSocket, Exception reason) { lock (_disconnectionSyncObj) { if (!_isDisconnecting) { _isDisconnecting = true; } else { Logg("Отключение уже выполняется, отмена"); return; // уже идет подключение, другие попытки параллельного подключения отбрасываются } } Logg("Disconnect > до начала отключения число подключений = " + _connectionCounter.Count); try { Logg("Отключение по причине: " + reason); localSocket.Disconnect(true); Logg("Отключено"); } catch (Exception ex) { Logg("Ошибка при отключении" + ex); lock (_disconnectionSyncObj) { _isDisconnecting = false; } } finally { _connectionCounter.DecrementCount(); _notifyThreadWorker.AddWork(() => Disconnected.SafeInvoke(this, new DisconnectedEventArgs(reason))); } }
private void AsyncRecurseArchiveReadMethod(string objName, WaitableCounter sharedTasksCounter) { Log.Log("Рекурсивное чтение архивов для " + objName); var nowTime = DateTime.Now; DateTime?timeToGet = _storage.GetFirstMissedTimeUpToTime(objName, nowTime); if (timeToGet.HasValue) { var time = timeToGet.Value; var cmd = new ReadArchiveRecordServiceCommand(time); Log.Log("Есть архивы, которые нужно вычитать. Имя объекта=" + objName + " Команда=<" + cmd.Comment + "> Время=" + cmd.RequestedTime.ToSimpleString() + " Арх.№=" + cmd.RecordNumber); sharedTasksCounter.IncrementCount(); _bumizIoManager.SendDataAsync(objName, cmd, result => { try { Log.Log("Асинхронный запрос к сети БУМИЗ выполнен для объекта " + objName); if (result != null) { if (result.ChannelException == null) { Log.Log(result.Bytes.ToText() + " <= для времени = " + time.ToSimpleString() + " Арх.№=" + cmd.RecordNumber); try { var ctResult = cmd.GetResult(result.Bytes); Log.Log(ctResult.ToString()); if (ctResult.RecordTime.Date == time.Date) { Log.Log("Даты совпадают, сохраняем данные в хранилище"); _storage.SaveData(objName, time, true, ctResult.Count1, ctResult.Count2, ctResult.Count3, ctResult.Status, ctResult.Xstatus); } else { throw new Exception("Дата внутри архива не совпадает с датой запроса"); } } catch (Exception ex) { Log.Log("Ошибка обработки ответа БУМИЗ, в хранилище будет записана информация о плохой записи архива"); Log.Log("Причина - исключение: " + ex.ToString()); _storage.SaveData(objName, time, false, 0, 0, 0, 0, 0); } finally { AsyncRecurseArchiveReadMethod(objName, sharedTasksCounter); } } else { Log.Log("Ошибка канала передачи данных: " + result.ChannelException.ToString()); Log.Log("Объект " + objName + " больше не будет опрашиваться в этой итерации (пока все остальные не закончат свои обмены)"); // Получается, что при ошибке передачи данных следующий запрос не будет осуществлен, и объект выпадает из цикла опроса, пока другие объекты не закончат свои работы } } else { Log.Log("Результат выполнения операции не существует, странно :О"); } } catch (Exception ex) { Log.Log("Произошла ошибка при разборе ответа от объекта " + objName); Log.Log(ex.ToString()); // TODO: что делать при ошибке чтения данных (нет связи с FRAM)? } finally { Log.Log("Декремент счетчика задач сети БУМИЗ для объекта " + objName); sharedTasksCounter.DecrementCount(); } }, IoPriority.Low); } else { Log.Log("Либо ошибка хранилища, либо для объекта " + objName + " все данные вычитаны"); } }