【发布时间】:2013-11-02 04:22:39
【问题描述】:
我需要设计自定义数据流块,它的作用类似于缓冲区,但会在超时后使项目可用。我会将传入的消息放入队列并启动计时器。当定时器被触发时,我会将队列中的一个项目移动到 BufferBlock 中,这将使其可供 Dataflow 消费者使用。
如果我将一个项目从内部队列移动到定时器处理程序的输出 BufferBlock 中,显然它不会是线程安全的,因为定时器处理程序可能与入队调用和损坏的队列发生冲突。 MSDN 中声称数据流是基于 Actor 思想的,它假设消息是单线程执行的,从而解决了同步问题。但是如果我引入一个计时器处理程序,这将打破这个假设。我可以在队列上使用老式锁,或者使用 CuncurrentQueue,但我很好奇是否有更多特殊的数据流方式来管理计时器,这样它就不会与数据流块的 Post() 调用冲突。
或者扩展这个问题,是否有一种优雅的方式让数据流块处理几种不同类型的消息并仍然提供线程安全模型?
【问题讨论】:
标签: c# task-parallel-library actor tpl-dataflow