выход из системы не работает после SeqReset

#c# #quickfix #quickfixn

#c# #быстрое исправление #quickfixn

Вопрос:

Использование C # и QuickFix / N

Я пытаюсь чисто выйти из инициатора.

            initiator.Stop(true);

            int tryCount = 5;
            while (initiator.IsLoggedOn)
            {
                tryCount--;
                if (tryCount <= 0)
                    break;
                Thread.Sleep(1000);
            }
  

Если я ранее вышел из системы чисто — под этим я подразумеваю, что я отправил и получил 35 = 5 сообщений. Тогда выход из системы работает.

Однако, если я просто разорву соединение и при входе в систему получу 35 = 4 сообщения с просьбой о сбросе, то при попытке выхода из системы я не вижу своих 35 = 5 в журналах.

Почему?

Однажды я также получил это сообщение при выходе из системы:

Система.Исключение ObjectDisposedException было необработанным HResult=-2146232798
Сообщение = Не удается получить доступ к удаленному объекту. Имя объекта: ‘FileLog’.
Источник=QuickFix ИмяобъЕкта = Список файлов StackTrace: в QuickFix.FileLog.DisposedCheck() в QuickFix.FileLog.onEvent (строки) в QuickFix.Session.Отключение (строковая причина) в QuickFix.SocketInitiatorThread.Read() в QuickFix.Транспортировка.Инициатор SocketInitiator.SocketInitiatorThreadStart(объект socketInitiatorThread) в системе.Многопоточность.ExecutionContext.RunInternal(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое значение сохраняет SyncCtx) в системе.Многопоточность.ExecutionContext.Run(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое значение сохраняет SyncCtx) в системе.Многопоточность.ExecutionContext.Run(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта) в системе.Многопоточность.ThreadHelper.ThreadStart(объект obj) Исключение InnerException:

Редактировать

Я нашел решение, которое заключается в выходе из каждого сеанса перед вызовом Stop. Это НЕ предлагается в документации.

Я думал, что Stop неявно сделает это.

             var sessionIDs = initiator.GetSessionIDs().ToList();
            foreach (var sessionID in sessionIDs)
            {
                Session session = Session.LookupSession(sessionID);
                session.Logout("Normal logout");

            }
            Thread.Sleep(1000);
            int tryCount = 5;
            while (initiator.IsLoggedOn)
            {
                tryCount--;
                if (tryCount <= 0)
                    break;
                Thread.Sleep(1000);
            }
            initiator.Stop(true);
  

Ответ №1:

инициатор.Остановка (истина);

Ваш инициатор остановился, все сеансы завершены, так из какого сеанса вы выходите из системы?

Вы выходите из всех сеансов чисто, выходите из системы, а затем останавливаете инициатор. Предположительно, один сеанс все еще получал какие-либо сообщения, и вы останавливаете инициатора, не выходя из системы, ваш контрагент снова попытается отправить сообщение, предполагая, что вы потерпели крах. Если вы выйдете из системы, они поймут, что сеанс завершен, и попробуют войти в систему перед отправкой сообщения.