【问题标题】:logout not working after SeqResetSeqReset 后注销不起作用
【发布时间】:2017-02-19 23:04:00
【问题描述】:

使用 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。

为什么?

我也有一次在注销时收到此消息:

System.ObjectDisposedException 未处理 HResult=-2146232798
Message=无法访问已处置的对象。对象名称:“文件日志”。
源 = QuickFix 对象名称 = FileLog StackTrace: 在 QuickFix.FileLog.DisposedCheck() 在 QuickFix.FileLog.OnEvent(String s) 在 QuickFix.Session.Disconnect(字符串原因) 在 QuickFix.SocketInitiatorThread.Read() 在 QuickFix.Transport.SocketInitiator.SocketInitiatorThreadStart(对象 socketInitiatorThread) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback 回调, 对象状态, Boolean 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart(Object 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);

【问题讨论】:

    标签: c# quickfix quickfixn


    【解决方案1】:

    initiator.Stop(true);

    您的发起者已停止,所有会话都已终止,那么您要退出哪个会话?

    您干净地注销所有会话,注销然后停止启动器。假设一个会话仍在接收任何消息,并且您在没有将其注销的情况下停止发起者,您的对手将再次尝试发送消息,假设您已经崩溃。如果您将他们注销,他们将意识到会话已终止,并在发送消息之前尝试登录。

    【讨论】:

      猜你喜欢
      • 2013-06-17
      • 1970-01-01
      • 2021-07-09
      • 2021-11-20
      • 2016-05-14
      • 2017-01-07
      • 2012-06-19
      • 2018-06-09
      • 2012-12-10
      相关资源
      最近更新 更多