私はそのようなコードを持っています:
public void IssueOrders(List<OrderAction> actions)
{
foreach (var action in actions)
{
if (action is AddOrder)
{
uint userId = apiTransactions.PlaceOrder((action as AddOrder).order);
Console.WriteLine("order is placing userId = " + userId);
}
// TODO: implement other actions
}
// how to wait until OnApiTransactionsDataMessageReceived for all userId is received?
// TODO: need to update actions with received data here
}
private void OnApiTransactionsDataMessageReceived(object sender, DataMessageReceivedEventArgs e)
{
var dataMsg = e.message;
var userId = dataMsg.UserId;
apiTransactions.PlaceOrder
非同期であるためuserId
、結果として受信しますが、コールバックOnApiTransactionsDataMessageReceivedでデータを受信します。
したがって、たとえば、3つの注文を行うと、、、、などの3つのuserIdを1
受け取り3
ます4
。次に、これらすべてのuserIdのデータが受信されるまで待つ必要があります。
userId
これが重要な場合は常に増加しています。これはほとんど整数のシーケンスですが、並列実行のために一部の数値が省略される場合があります。
UPD注:
- IssueOrdersは、異なるスレッドから並行して実行できます
- PlaceOrderが返される前にcallackが呼び出される場合があります
UPD2
userId
「コールバック」が受信される前にそれがわかっていることを保証できるように、以下のPlaceOrderコードをリファクタリングする必要がある可能性があります。
public uint PlaceOrder(Order order)
{
Publisher pub = GetPublisher();
SchemeDesc schemeDesc = pub.Scheme;
MessageDesc messageDesc = schemeDesc.Messages[0]; //AddMM
FieldDesc fieldDesc = messageDesc.Fields[3];
Message sendMessage = pub.NewMessage(MessageKeyType.KeyName, "FutAddOrder");
DataMessage smsg = (DataMessage)sendMessage;
uint userId = counter.Next();
FillDataMessageWithPlaceOrder(smsg, order, userId);
System.Console.WriteLine("posting message dump: {0}", sendMessage);
pub.Post(sendMessage, PublishFlag.NeedReply);
sendMessage.Dispose();
return userId;
}
したがって、PlaceOrderを2つのメソッドに分割する必要があります:userId CreateOrder
とvoid PostOrder
。これにより、コールバックが受信されたときに私が知っていることが保証されますuserId
。