Quickfixn OnLogout не запускается при выходе из системы

Я написал торговое приложение на примере Tradeclient, который был на странице quickfixn github. Сейчас он сильно изменен, но в отношении входа и выхода не изменился. Теперь у меня проблема в том, что при нажатии кнопки выхода из системы вызывается Initiator.Stop, но он не входит в OnLogout, как предполагалось. При входе в систему он все делает правильно, initiator.start, затем OnCreate, а затем OnLogon, но при выходе из системы OnLogout не запускается. Есть идеи, в чем может быть проблема?

    private void Disconnect(object ignored)
    {
        Trace.WriteLine("ConnectionViewModel::Disconnect called");
        _qfapp.Stop();
    }

    public void Stop()
    {
        Trace.WriteLine("QFApp::Stop() called");
        Initiator.Stop(true);
    }

    public void OnLogout(QuickFix.SessionID sessionID)
    {
        // not sure how ActiveSessionID could ever be null, but it happened.
        string a = (this.ActiveSessionID == null) ? "null" : this.ActiveSessionID.ToString();
        Trace.WriteLine(String.Format("==OnLogout: {0}==", a));

        if (LogoutEvent != null)
        {
            LogoutEvent();
        }
    }

person MihkelT    schedule 23.01.2017    source источник


Ответы (1)


Это тот же ответ, что и здесь для DumbCoder. Initiator.Stop(true); останавливает механизм инициатора, поэтому все сеансы отключены. Это означает, что больше нет сеансов, из которых можно выйти.

Согласно этому ответу вы хотите прежде всего выйти из сеанса (-ов), используя

Session.lookupSession(sessionID).logout();

Однако, согласно комментарию Гранта, это необычный поступок. Я предполагаю, что функция onLogout () действительно предназначена для захвата, когда сеансы клиента выходят из принимающего устройства, но сам акцептор продолжает работать. Это не совсем для инициатора.

person rupweb    schedule 23.01.2017
comment
Должны ли вы сначала выйти из системы, прежде чем останавливать двигатель-инициатор? Эти фрагменты кода были взяты из образца торгового клиента, и всегда предполагалось, что это правильный путь. - person MihkelT; 23.01.2017
comment
Ну, вы никогда не остановите двигатель-инициатор. Примечание из примера (github.com/connamara/quickfixn / blob / master / Examples / TradeClient /), что код инициатора настроен, а затем вызывает application.Run, который является бессрочным while (true), поэтому ... в этом примере initiator.Stop никогда не вызывается, если приложение не аварийно завершает работу и возвращается. - person rupweb; 24.01.2017