#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:
инициатор.Остановка (истина);
Ваш инициатор остановился, все сеансы завершены, так из какого сеанса вы выходите из системы?
Вы выходите из всех сеансов чисто, выходите из системы, а затем останавливаете инициатор. Предположительно, один сеанс все еще получал какие-либо сообщения, и вы останавливаете инициатора, не выходя из системы, ваш контрагент снова попытается отправить сообщение, предполагая, что вы потерпели крах. Если вы выйдете из системы, они поймут, что сеанс завершен, и попробуют войти в систему перед отправкой сообщения.