线程调用非阻塞MSMQ异步接收是阻塞自身?

时间:2011-03-27 19:51:38

标签: multithreading asynchronous windows-services msmq

我在Windows服务应用程序中有一个类,它调用MessageQueue.BeginReceive()以在队列到达时从队列中获取消息。以前这是在服务的主线程的上下文中完成的,但我将它移动到一个单独的线程(每个队列一个)。

BeginReceive电话本质上是非阻塞的;这就是方法的重点。我相信内部运行时使用I / O完成端口(IOCP)来完成异步魔术,我假设它也是一个单独的托管线程(IOCP很好,但它们 阻塞)。

当我重新编写队列读取器类以在单独的线程中运行时,我这样做,期望异步接收不再有用,因为它将无法阻塞,导致线程proc立即退出。我以为我不得不改用轮询解决方案。

所以当我第一次在一个单独的线程上运行读取器时,我感到很惊讶,并且不知怎的,BeginReceive / EndReceive调用(我认为)导致线程阻塞,直到队列关闭。

IOW,我希望线程proc在调用BeginReceive时立即返回,因为它没有阻塞。但它不会那样工作。使用它的阅读器类的版本只是坐在那里愉快地在单独的线程上接收消息,直到我发出信号让它退出并且队列关闭。

现在不要误会我的意思,这很好。但我试图理解为什么托管线程以某种方式被阻止在一个单独的线程(BeginReceive)中发生的操作退出,并且它完全不知道什么。我需要知道这是如何工作的,以确定它是否是一种可行的,稳定的方法。托管线程是否“知道”存在待处理的异步操作或类似事件?

0 个答案:

没有答案
相关问题