示例#1
0
        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 + " все данные вычитаны");
            }
        }