.NET中的MSMQ:同步与异步?

时间:2012-09-17 15:58:42

标签: c# .net msmq messaging

何时以及使用哪种方式?

是否有任何理由使用异步方法,如果for synchronous是专用的单独线程?

3 个答案:

答案 0 :(得分:2)

您使用异步方法来阻止阻塞调用线程。此外,最好使用此方法,而不是创建将使用同步方法的专用线程。这是.NET通用建议,最好让.NET执行异步工作,而不是创建自己的专用线程。

编辑:Here is one question您可能对MSMQ和EndReceive感兴趣,它是.NET中MSMQ异步模型的一部分。

答案 1 :(得分:0)

我建议在使用MSMQ时使用 asychronous 方法。

MSMQ的主要目的之一是提供在解耦系统之间发送数据的解决方案。换句话说,理想情况下,只要发布者和订阅者知道如何处理邮件内容,就不应该知道任何事情

这包括发送方不必担心接收方何时处理发送的消息。它可以立即处理,也可以在已经堆放在接收者队列中的几千条其他消息之后处理。

或者考虑离线数小时甚至数天的接收器。使用事务性队列时,一旦接收器重新联机,您的消息甚至会被传递,但是您是否希望同步等待这么长时间? : - )

与往常一样,这取决于您想要做什么

如果您希望保证消息按特定顺序处理,则使用同步方法可能会有所帮助。但我想有更多的情况不关心,或者太复杂而无法做出任何保证。

一些例子可以让我更清楚我的意思:

  • 想象一下涉及负载平衡器/调度程序的架构。当该平衡器通过多个服务或线程传播收到的消息时,您不能依赖订单和时间等方面。恕我直言,你不想同步这样做。

  • 另一种常见做法是向单个发布商提供多个订阅者。一个简单的例子可能是想要将最新的聊天消息发送给几百个聊天客户端的聊天服务器。同样,您不希望同步执行此操作。

回到这个问题,你没有放弃任何东西从开始就使用异步。相反,您获得灵活性可扩展性,实现其使用的解耦越多。

答案 2 :(得分:0)

之后的某个时间......

异步读取不包含读取线程。它注册一个回调,当一个消息被完全读取时,它会返回原始被叫者并显示此消息。如果你需要你的线程去做其他的工作,这很好。

我实际发现的是, sync 的读取速度是异步的两倍。因为没有涉及回调和可能更少的线程开销,所以单个线程读取的队列消息数量增加了一倍。

我建议在你的平台上测量它,而不是盲目地遵循async-await模式(在大多数其他情况下这是非常好的)