【问题标题】:Manage data in a realtime simulation在实时模拟中管理数据
【发布时间】:2013-12-06 16:29:17
【问题描述】:
我正在为车辆进行实时仿真项目,并正在寻找有关 C# 中处理每个时间步生成的数据的最佳解决方案的建议。
基本上,我有一个可以实时计算解决方案并且可以独立运行的主引擎。同时,我需要存储以某种方式生成的数据——但没有任何实时要求。在每个时间步,我都在生成 sqlite 命令行并寻找一种解决方案来并行执行它而不会减慢主引擎的速度。
有什么建议可以组合出最好的结构来解决这个问题吗?
【问题讨论】:
标签:
c#
multithreading
queue
real-time
【解决方案1】:
我不知道“最佳”是什么,但一个非常好的解决方案是将数据放入队列中,并有一个单独的线程从队列中读取数据并将其持久化。
主要优点是收集数据的线程不会因为等待数据库而陷入困境。它可以将那个时间步的数据排入队列并返回到它正在做的事情(大概是为下一个时间步获取数据)。
持久化数据的线程可以独立运行。如果数据库足够快,如果可以为每个时间步执行一次数据库插入。或者它可能会批量处理数据并一次发送多条记录以进行批量插入。
要实现这一切,请创建一个BlockingCollection(共享队列),收集线程写入其中,持久线程从中读取。 BlockingCollection 处理多个生产者和多个消费者,而无需您进行显式锁定或类似的操作。它真的很容易使用,而且性能很好。它使这种事情实现起来非常快。