gpt4 book ai didi

c# - 排队消息的等待系统应该如何在 C# 中实现

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:35 26 4
gpt4 key购买 nike

我有一项服务使用一个线程来等待传入的消息,然后将它们放入队列中。传入消息的频率各不相同。它们可能会频繁出现,或者有时会成批发送,每批之间的等待时间较长。

另一个线程检查队列并处理消息(如果有)。如果没有消息,那么它应该等到消息被放入队列。现在,处理消息的代码如下所示。

public void Run() {
while(thereAreNoItemsInQueue) {
Thread.Sleep(1);
}

//Start processing messages from queue
}

我听说在这样的循环中使用 Sleep 是不好的做法,那么在这种情况下实现等待的最佳做法是什么?我已经研究过其他方法来进行等待,使用 AutoResetEvent/ManualResetEvent 或使用 Monitor,但我不确定哪种方法最好。

  • 我还应该补充一点,保存这些消息的队列是一个事务性 MSMQ

最佳答案

不是在 C# 中。绝不。见:

They can come frequently or sometimes they get sent in giant batches with longer wait times in between each batch.

这也可能意味着批处理的处理时间,表示“使用持久性”。

Windows 有一个队列机制 (MSMQ),您可以使用数据库。但是如果你必须处理它们,你永远不应该在没有坚持的情况下让工作项目在进行中。服务器蓝屏怎么办?

将它们转储到持久队列中,然后从中开始工作。

如果您必须让它们保持在队列中...为什么要阻塞线程?那太浪费了。

当消息到来时,创建一个 TASK 来处理队列(如果不存在)。这样一个没有消息的队列就不会阻塞线程(这是昂贵的)。

对于一些完全微不足道的事情,考虑使用自定义调度程序来设计任务(以确保它们同时处理最大 x 个)——瞧。对于进程内排队,.NET 中已经没有多种机制。

关于c# - 排队消息的等待系统应该如何在 C# 中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com