线程循环并等待来自缓冲区的消息 - 最佳解决方案

时间:2012-09-19 23:15:31

标签: c# multithreading buffer synchronisation

我有特定问题,我希望有一个单独的工作线程,如果缓冲区不为空,在某些时段控制。如果不是,线程从缓冲区发送数据(ConcurrentQueue)......是否有任何好的解决方案,这对CPU来说并不贵?

这是我的方法,它可以工作但可能不是很好(实际上我并没有过多地讨论线程同步)。

public void start(object timeout){

            //Message - my own objective implementation of some tcp message
            Message m;
            while (true) {
                if (msgBuffer.Count != 0) {
                    if (msgBuffer.TryDequeue(out m)) {
                        client.SendData(MediatorPacket.GetPacketBytes(m));
                        SpinWait.SpinUntil(() => { if (msgBuffer.Count != 0) return true; else return false; });
                    }
                }
            }
        }*/

2 个答案:

答案 0 :(得分:1)

绝对。看看TPL DataFlow图书馆。特别是,BufferBlock应该符合您的需求。您可能还会发现this primer一个有趣的读物。

答案 1 :(得分:0)

听起来您正在寻找具有阻止行为的生产者 - 消费者(即,在缓冲区中存在数据之前,消费者将阻止并且不会被安排)。在这种情况下,请查看BlockingCollection