使用 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);