【发布时间】: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);
【问题讨论】: