我在C#中有一个QuickFix应用程序:
await
从 public class MyQuickFixApp : IApplication
{
...
public void ToApp(Message msg, SessionID sessionID)
{
string s = msg.GetString(Tags.ClOrdID);
...
}
public void FromApp(Message msg, SessionID sessionID) { }
}
发送到其他Fix Server的消息,而回复则来自ToApp
。
我需要存储已发送邮件(FromApp
)的标签值以选择相应的回复。 s
方法返回void。我试图将值存储在公共静态文件中,但失败。
看起来如下:
ToApp
我在 public class MyQuickFixApp : IApplication
{
...
public static string currClOrdID = "";
public void ToApp(Message msg, SessionID sessionID)
{
string s = msg.GetString(Tags.ClOrdID);
currClOrdID = s;
...
}
public void FromApp(Message msg, SessionID sessionID)
{
if (Equals(currClOrdID)) ...
}
}
上得到NullreferenceException
。这样做的一般策略是什么?请给我一些提示。
答案 0 :(得分:1)
编写应用程序的最佳方法是使用特定的强类型Message和Field类
因此您可以在Crack(...);
中使用FromApp
:
using QuickFix;
public class MyApplication : MessageCracker, IApplication
{
public void FromApp(Message msg, SessionID sessionID)
{
Crack(msg, sessionID);
}
//...
}
关于ClOrdID
,您可以从消息中提取它并将其直接传递给处理函数,这比在多线程消息处理中将ClOrdID
保留在静态变量中更为安全。
例如(假设您需要处理ExecutionReport
消息):
public void OnMessage(QuickFix.FIX44.ExecutionReport msgReport, SessionID sessionID)
{
string clOrdID = msgReport.ClOrdID.getValue();
...
YourProcessing(clOrdID, ...);
}
请注意,将从OnMessage(...)
中调用Crack(msg, sessionID);
如果您需要存储其他数据来处理收到的消息,我将使用字典,因为您可能有几条待处理的消息,并且响应可能会以不可预测的顺序到达。同样,将这样的数据存储在调用Send
之前(和之前)而不是在ToApp
中存储逻辑,就像下面这样(假设您正在发送执行命令,希望得到ExecutionReport
的回复) :
private ConcurrentDictionary<string, ...> _orderData =
new ConcurrentDictionary<string, ...>();
public bool PlaceNewOrder(...)
{
string clOrdID = ...;
QuickFix.FIX44.NewOrderSingle msgOrder =
new QuickFix.FIX44.NewOrderSingle(new ClOrdID(clOrdID), ...);
...;
_orderData.TryAdd(clOrdID, <data required for later processing>);
// Notice the data is stored before sending the message
// so it will be available to process a response
Session.SendToTarget(msgOrder, sessionID);
}
在处理响应消息时,您可以检索为此特定clOrdID
存储的数据:
private void YourProcessing(clOrdID, ...)
{
...;
_orderData.TryGetValue(clOrdID, out ...);
// You may want to check return value to make sure the data was stored for this clOrdID...
...;
}
还要注意,您应该在某些时候清理字典,例如,当您从已处理的消息中知道它是最后一个字典时,不要再为此ClOrdID
收到消息了。