65.9K
CodeProject 正在变化。 阅读更多。
Home

消息循环对象

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (12投票s)

2005年8月29日

CPOL

2分钟阅读

viewsIcon

52982

downloadIcon

777

使用消息循环异步顺序执行方法。

Sample Image - messageloop.jpg

引言

让我们来看一下以下场景:您有一个应该异步执行的对象。但是,如果需要多次执行相同的操作,您希望保持原始调用的顺序。换句话说,您希望该对象保留一个内部调用缓冲区,并在一个单独的线程上按顺序处理它们(全部在与调用线程不同的同一线程中)。我们都知道这只是:一个消息循环。

这可以被视为一个单线程线程池的特定情况。但是,由于它是一个特殊情况,您可以让它比一个功能齐全的线程池简单得多。顺便说一下,如果您想要一个真正实现良好、功能丰富的线程池,您绝对应该看看 Ami Bar 的 Smart Thread Pool

它是如何工作的?

所有调用都保存在一个内部队列中。该队列由一个单独的线程按顺序(FIFO)清空,每次从队列中提取一个项目时,都会执行其对应的操作。队列中的对象保存对要调用的方法的委托和一个状态对象,类似于线程池。

为了避免缓冲区过度填充,您可以预定义一个最大缓冲区大小。当缓冲区达到该大小后,任何额外的消息都将被丢弃,直到缓冲区中有一些可用空间(默认大小为 int.Max)。

我发现在哪里有用?

我在几个地方必须从 MSMQ 队列中读取消息,并在收到消息后执行某些操作。有时,消息的顺序非常重要,在之前的消息完成之前,我不应该开始处理一条消息。另一个很好的例子是各种日志记录机制。对于日志记录,消息的顺序非常重要。但是,您希望线程尽快返回给调用者,以减少使用日志记录的开销。因此,使用消息循环,我可以很快地将消息放入队列中,并在后台进行记录,从而提供异步顺序日志记录。

演示中有什么?

演示非常简单,它只是向您展示消息确实是按照它们添加到队列中的顺序处理的。作为对比,您可以取消标记将消息发送到线程池的那一行,看看区别。

© . All rights reserved.