2016-10-11 45 views
0

使用C#和QuickFix/N註銷SeqReset後不工作

我想從發起者乾淨地註銷。

  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
消息=無法訪問已釋放的對象。對象名稱:'FileLog'。
源= QuickFix的對象名= FileLog堆棧跟蹤: 在QuickFix.FileLog.DisposedCheck() 在QuickFix.FileLog.OnEvent(字符串或多個) 在QuickFix.Session.Disconnect(字符串原因) 在QuickFix.SocketInitiatorThread.Read() 在QuickFix.Transport.SocketInitiator.SocketInitiatorThreadStart(對象 socketInitiatorThread) 在System.Threading.ExecutionContext.RunInternal(的ExecutionContext 的ExecutionContext,ContextCallback回調,對象的狀態,布爾 preserveSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext中的ExecutionContext ,ContextCallback回調,對象狀態,布爾型 preserveSyncCtx) 在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回調,對象狀態) 在System.Threading.ThreadHelper.ThreadStart(對象OBJ)的InnerException:

EDIT

我有找到了一個解決方案,即在調用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

initiator.Stop(真);

您的發起人已停止,所有會話都終止,那麼您註銷哪個會話?

乾淨地註銷所有會話,註銷然後停止啓動器。假設一個會話仍然收到任何消息,並且您在沒有註銷的情況下停止發起人,假設您已經崩潰,則您的對手方將再次嘗試發送消息。如果您註銷它們,他們會意識到會話已終止,並在發送消息之前嘗試登錄。

+0

查看代碼編輯...爲什麼這不在DOCS中? – ManInMoon