我正在写交易软件。我的系统生成需要处理的“顺序项”(1,2,3 ...)(在我的应用程序中,每个项目都是执行顺序,id是所谓的内部订单ID)。
我有许多线程可以生成项目(许多策略),但保证每个项目都会生成完全一次。
我只有一个应该
的处理器(订单执行者)每个制作人都应该
请注意:
如果你能提出建议 - 请提出建议。我在下面添加了我的奇怪实现,但没有必要阅读它。
这是我的 prolem 实施:
private Dictionary<uint, AutoResetEvent> transactionsEvents = new Dictionary<uint, AutoResetEvent>();
private Dictionary<uint, TransactionResult> transactionsResults = new Dictionary<uint, TransactionResult> ();
public void IssueOrders(List<OrderAction> actions)
{
int count = actions.Count;
if (count == 0)
{
return;
}
uint finishUserId = (uint) apiTransactions.counter.Next(count);
uint startUserId = finishUserId + 1 - (uint) count;
AutoResetEvent[] events = new AutoResetEvent[count];
for (int i = 0; i < count; i++)
{
var action = actions[i];
uint userId = startUserId + (uint) i;
action.UserId = userId;
var e = new AutoResetEvent(false);
events[i] = e;
transactionsEvents[userId] = e;
}
for (int i = 0; i < count; i++)
{
var action = actions[i];
apiTransactions.ScheduleOrderAction(action);
}
WaitHandle.WaitAll(events);
// now all answers are available, need to apply information
foreach (var action in actions)
{
UpdateActionWithResult(action, transactionsResults[action.UserId]);
transactionsResults.Remove(action.UserId);
}
}
ScheduleOrderAction
将项添加到BlockingCollection。处理器从BlockingCollection执行项目,将结果放入transactionsResults并引发相应的事件。
我的实施有很多问题:
transactionResults
移除项目时,另一个线程(处理器)可能会向其添加项目。