使用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);
答案 0 :(得分:1)
<强> initiator.Stop(真); 强>
你的发起人已停止,所有会话都已终止,那么你要退出哪个会话?
您干净地退出所有会话,注销然后停止启动器。据说一个会话仍然收到任何消息,你停止发起人而不记录它们,你的对手会再次尝试发送消息,假设你已经崩溃了。如果您将其注销,他们将意识到会话已终止并尝试登录,然后再发送消息。