加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 连续检查队列

发布时间:2020-12-15 06:32:08 所属栏目:百科 来源:网络整理
导读:我想要一个函数在一个线程上连续检查新添加的队列 显然,有一个连续循环的睡眠选项,但我想要的东西不那么浪费. 我考虑了某种类型的等待句柄,然后让队列发出信号,但是我不能安全地覆盖入队,因为它不是虚拟的. 现在我正在考虑封装Queue T作为我最好的选择,但我
我想要一个函数在一个线程上连续检查新添加的队列

显然,有一个连续循环的睡眠选项,但我想要的东西不那么浪费.

我考虑了某种类型的等待句柄,然后让队列发出信号,但是我不能安全地覆盖入队,因为它不是虚拟的.

现在我正在考虑封装Queue< T>作为我最好的选择,但我想问你好人是否有更好的一个!

这个想法是:我希望许多线程访问套接字连接,同时保证他们只读取其消息的响应,所以我要有一个线程调度和读取响应,然后使用响应数据(纯文本)执行回调,

解决方法

尝试阻塞队列: Creating a blocking Queue<T> in .NET?

基本思想是当您调用TryDequeue时,它将阻塞,直到有一些队列中的东西.正如你可以看到阻塞队列的“美”是你不必轮询/睡觉或做任何类似的事情…它是生产者/消费者模式的基础骨干.

我的版本的阻塞队列是:

public class BlockingQueue<T> where T : class
{
    private bool closing;
    private readonly Queue<T> queue = new Queue<T>();

    public int Count
    {
        get
        {
            lock (queue)
            {
                return queue.Count;
            }
        }
    }

    public BlockingQueue()
    {
        lock (queue)
        {
            closing = false;
            Monitor.PulseAll(queue);
        }
    }

    public bool Enqueue(T item)
    {
        lock (queue)
        {
            if (closing || null == item)
            {
                return false;
            }

            queue.Enqueue(item);

            if (queue.Count == 1)
            {
                // wake up any blocked dequeue
                Monitor.PulseAll(queue);
            }

            return true;
        }
    }


    public void Close()
    {
        lock (queue)
        {
            if (!closing)
            {
                closing = true;
                queue.Clear();
                Monitor.PulseAll(queue);
            }
        }
    }


    public bool TryDequeue(out T value,int timeout = Timeout.Infinite)
    {
        lock (queue)
        {
            while (queue.Count == 0)
            {
                if (closing || (timeout < Timeout.Infinite) || !Monitor.Wait(queue,timeout))
                {
                    value = default(T);
                    return false;
                }
            }

            value = queue.Dequeue();
            return true;
        }
    }

    public void Clear()
    {
        lock (queue)
        {
            queue.Clear();
            Monitor.Pulse(queue);
        }
    }
}

非常感谢Marc Gravell这个!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读