c# - 从 C# 中的 ConcurrentQueue 中取出对象

标签 c# .net

嘿,我正尝试在 C# 中为异步服务器实现一个 ConcurrentQueue。收到完整消息后,项目将立即排队。为了使消息出列,我创建了少量线程来完成出列和服务请求的工作。这是不够的,因为每个线程都使用一个 while 循环,这会消耗相当多的处理器时间,原因很明显。

有谁知道一种在需要时将消息出列但又不会消耗太多处理时间的方法。

{
    ...

    for (int i = 0; i < 3; i++)
    {
        Thread t = new Thread(new ThreadStart(startParsingMessages));
        t.Start();
    }

    ...
}

private void startParsingMessages()
{
    QueueContainer dequeued = null;
    Console.WriteLine("Trying");
    while (true)
    {
        if (queue.TryDequeue(out dequeued))
        {
            Console.WriteLine("processing queue");
            ProcessMessage(dequeued.socket, dequeued.message);
        }
    }
}

最佳答案

而不是使用 ConcurrentQueue<T>直接地,你试过把它包装在 BlockingCollection<T> 中吗? ?然后你可以使用TryTake(out T, TimeSpan)等等。我相信这是预期的用途:并发集合本身通常就在那里,这样您就可以选择阻塞集合的工作方式。

当然,这不一定是这些集合的唯一用途,但特别是 ConcurrentQueue<T> ,生产者/消费者队列场景是最常见的场景 - 此时 BlockingCollection<T>是让做正确的事变得容易的方法。

关于c# - 从 C# 中的 ConcurrentQueue 中取出对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3502902/

相关文章:

c# - 如何使用 System.Net.Mail 设置 SMTP 信封 MAIL FROM?

c# - ASP.NET Core 的 "asp-fallback-*"CDN 标签助手如何工作?

c# - 是否可以在 SQL Server 中创建只读同义词?

c# - VirtualMemorySize64 和 PrivateMemorySize64 有什么区别

c# - 如何使用无损方法压缩和解压缩 JPEG?

.net - FluentMigrator迁移成功,但数据库没有变化

c# - 如何在运行时添加新的 MvcSitemapProvider 节点

c# - 从模型数组中透视 json 数据

c# - C#中的Java内部类

c# - 使用 openXML 检查文件大小