1

使用 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
消息=无法访问已处置的对象。对象名称:“文件日志”。
Source=QuickFix ObjectName=FileLog StackTrace: QuickFix.FileLog.DisposedCheck() at QuickFix.FileLog.OnEvent(String s) at QuickFix.Session.Disconnect(String reason) at QuickFix.SocketInitiatorThread.Read() at QuickFix.Transport.SocketInitiator .SocketInitiatorThreadStart(Object socketInitiatorThread) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在系统.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper。ThreadStart(Object obj) 内部异常:

编辑

我找到了一个解决方案,即在调用 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);
4

1 回答 1

1

发起者.停止(真);

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

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

于 2016-10-12T07:45:22.910 回答