Multithreading 调用非阻塞MSMQ异步接收的线程正在阻塞自身?
我在windows服务应用程序中有一个类,它调用Multithreading 调用非阻塞MSMQ异步接收的线程正在阻塞自身?,multithreading,asynchronous,windows-services,msmq,Multithreading,Asynchronous,Windows Services,Msmq,我在windows服务应用程序中有一个类,它调用MessageQueue.BeginReceive(),以便在消息到达时从队列中获取消息。以前,这是在服务的主线程上下文中完成的,但我将其移动到一个单独的线程(每个队列一个线程) BeginReceive调用本质上是非阻塞的;这就是这个方法的全部要点。我相信运行时在内部使用I/O完成端口(IOCP)来完成异步魔术,我假设它也是一个单独的托管线程(IOCP很好,但它们是阻塞的) 当我重新编写队列读取器类以在单独的线程中运行时,我这样做的目的是希望异步
MessageQueue.BeginReceive()
,以便在消息到达时从队列中获取消息。以前,这是在服务的主线程上下文中完成的,但我将其移动到一个单独的线程(每个队列一个线程)
BeginReceive
调用本质上是非阻塞的;这就是这个方法的全部要点。我相信运行时在内部使用I/O完成端口(IOCP)来完成异步魔术,我假设它也是一个单独的托管线程(IOCP很好,但它们是阻塞的)
当我重新编写队列读取器类以在单独的线程中运行时,我这样做的目的是希望异步接收不再有用,因为它将无法阻止,导致线程进程立即退出。我想我将不得不转而使用轮询解决方案
因此,当我第一次在一个单独的线程上运行读卡器时,我很惊讶,不知何故,BeginReceive/EndReceive调用(我认为)导致线程阻塞,直到队列关闭
注意,我希望线程进程在调用BeginReceive后立即返回,因为它没有阻塞。但不是这样的。使用它的reader类的版本只是在单独的线程上愉快地接收消息,直到我发出信号让它退出并且队列关闭
别误会,这很好。但是我试图理解为什么托管线程被一个单独的线程(BeginReceive)中发生的操作阻止退出,而它对此一无所知。我需要知道它是如何工作的,以便决定它是否是一种可行的、稳定的方法。托管线程是否以某种方式“知道”存在挂起的异步操作或类似操作?您是说旧代码仍在调用Receive()?不要这样做,代码将阻塞内部锁。不,我测试了旧代码只是为了看看发生了什么。它仍在呼叫BeginRecieve()