C# 交易指令簿更新和计算

C# 交易指令簿更新和计算,c#,dictionary,C#,Dictionary,我正在工作中建立一个二级订单 我正在使用一个并发字典来分别存储出价和出价的数据 我正在使用UDP侦听器读取数据包数据,在处理数据包之后,我将更新传递给任务的bid/ask字典 这工作很好,更新速度很快,但看起来很笨重 当我需要在订单簿上进行任何计算时,我必须锁定它进行计算,考虑到它是一个并发字典,这似乎是一件坏事。我觉得我在放慢一切违背目标的事情 您建议我如何绕过锁定问题并放慢更新速度以对数据进行计算 很抱歉,我无法发布代码,因为我目前外出,但我无法停止思考如何解决此问题。该设计已达到仅使用一个

我正在工作中建立一个二级订单

我正在使用一个并发字典来分别存储出价和出价的数据

我正在使用UDP侦听器读取数据包数据,在处理数据包之后,我将更新传递给任务的bid/ask字典

这工作很好,更新速度很快,但看起来很笨重

当我需要在订单簿上进行任何计算时,我必须锁定它进行计算,考虑到它是一个并发字典,这似乎是一件坏事。我觉得我在放慢一切违背目标的事情

您建议我如何绕过锁定问题并放慢更新速度以对数据进行计算


很抱歉,我无法发布代码,因为我目前外出,但我无法停止思考如何解决此问题。

该设计已达到仅使用一个数据竖井的限制。因此,我建议更改设计以适应两个思洛存储器和一个数据管理器

主要目标应该是以及时但安全的方式进行所需的计算操作,然后集中精力于任何数据输入,这些数据输入应该是自由的,不会被阻塞


在这个设计中,有三个线程、一个管理器和两个数据仓库

数据输入
UDP侦听器的线程将把所有传入的数据存储到一个数据库中。该存储思洛存储器将以FIFO方式处理数据的并发需求

数据管理器 第二个线程运行一个数据管理器单例,它将smurf()数据从数据输入
ConcurrentQueue
转移到最终的思洛存储器。由于传入数据位于队列中,因此可以限制通过此虚拟网桥的记录总数,以实现可测量/监视的标准性能

最终数据筒仓(
订单
) 求和操作的最后一个线程是数据最终驻留的位置。数据本身可以是一个标准字典,由数据管理器或求和过程锁定。然后可以更改访问优先级,使求和过程优于数据管理器,反之亦然;这将取决于行动的最终需要


通过这种设计,数据输入被解除阻塞,求和操作优先于以测量方式输入的数据

既然使用ConcurrentDictionary,为什么要使用lock?如果我需要像我一样计算前5个级别的总容量。求和值时,字典会更新,而我求和值时会损坏,结果值会出现一些奇怪的整数。将数据存储在SQL server之类的数据库中。最后你是如何解决的?您可以发布任何示例代码吗?或者在github上?你能看看这个吗?