在SeqReset之后注销不起作用

时间:2016-10-11 11:54:48

标签: c# quickfix 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。

为什么?

我有一次在退出时收到此消息:

  

System.ObjectDisposedException未处理HResult = -2146232798
  Message =无法访问已处置的对象。对象名称:&#39; FileLog&#39;。
  Source = QuickFix ObjectName = FileLog StackTrace:          在QuickFix.FileLog.DisposedCheck()          在QuickFix.FileLog.OnEvent(String s)          在QuickFix.Session.Disconnect(字符串原因)          在QuickFix.SocketInitiatorThread.Read()          在QuickFix.Transport.SocketInitiator.SocketInitiatorThreadStart(Object   socketInitiatorThread)          在System.Threading.ExecutionContext.RunInternal(ExecutionContext   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)          at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean   preserveSyncCtx)          在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);

1 个答案:

答案 0 :(得分:1)

  

<强> initiator.Stop(真);

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

您干净地退出所有会话,注销然后停止启动器。据说一个会话仍然收到任何消息,你停止发起人而不记录它们,你的对手会再次尝试发送消息,假设你已经崩溃了。如果您将其注销,他们将意识到会话已终止并尝试登录,然后再发送消息。