1

我正在使用 .net 框架 4.0 以 Windows 形式开发股票市场应用程序。我正在从交易所实时获取报价。我能够实时接收报价。在我的场景中,我必须创建一个线程,该线程将在通用集合中写入实时提要,其他持续运行的后台线程将从集合中获取它并进行进一步处理。为了实现这一点,我使用了ConcurrentDictionaryConcurrentQueue的组合。键包含符号名称和值包含 ConcurrentQueue。这就是它的实施方式检查第一个答案

这工作得很好我唯一担心的是延迟。这个过程会导致 1 秒的延迟,因为股票价格必须实时波动。这种情况可以通过其他逻辑实现,还是我可以以某种方式提高 ConcurrentDictionary 或 ConcurrentQueue 的性能以避免延迟?

4

2 回答 2

3

你真的需要一个并发字典吗?仅当您找到新符号时,您的字典才会更改。如果您碰巧事先知道所有符号,则可以创建一个普通字典,为每个符号填充一个队列,仅此而已 - 字典永远不会改变。

不过,我不确定您的处理线程是如何工作的 - 它如何知道接下来要查看哪个队列?它是否会遍历所有队列以查看是否还有更多数据?也许您需要的只是一个ConcurrentQueue可以保存所有股票市场事件,并在后台将其分成单独的容器(可能没有同步)。

于 2013-05-22T17:23:21.680 回答
1

为什么不将包含 stmbol-id 和相应页面的对象入队,由工作线程将其出列(不为每个符号 id 分配专用线程),然后,工作线程将根据需要将页面发送到正确的处理使用简单的 switch case 语句在符号 id 上。

这样,您不必检查符号是否存在队列。您将只有一个类型的线程安全队列,并且您可以使用 ThreadPool 进行处理!

工作线程会这样做:

IdPagePair pair = market.Dequeue();

if (pair.Id == 1) { Process1(pair.Page); }

else 

if (pair.Id == 2) { Process2(pair.Page); }

// etc...
于 2013-05-22T17:30:02.453 回答