Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 调用非阻塞MSMQ异步接收的线程正在阻塞自身?_Multithreading_Asynchronous_Windows Services_Msmq - Fatal编程技术网

Multithreading 调用非阻塞MSMQ异步接收的线程正在阻塞自身?

Multithreading 调用非阻塞MSMQ异步接收的线程正在阻塞自身?,multithreading,asynchronous,windows-services,msmq,Multithreading,Asynchronous,Windows Services,Msmq,我在windows服务应用程序中有一个类,它调用MessageQueue.BeginReceive(),以便在消息到达时从队列中获取消息。以前,这是在服务的主线程上下文中完成的,但我将其移动到一个单独的线程(每个队列一个线程) BeginReceive调用本质上是非阻塞的;这就是这个方法的全部要点。我相信运行时在内部使用I/O完成端口(IOCP)来完成异步魔术,我假设它也是一个单独的托管线程(IOCP很好,但它们是阻塞的) 当我重新编写队列读取器类以在单独的线程中运行时,我这样做的目的是希望异步

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

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

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

因此,当我第一次在一个单独的线程上运行读卡器时,我很惊讶,不知何故,BeginReceive/EndReceive调用(我认为)导致线程阻塞,直到队列关闭

注意,我希望线程进程在调用BeginReceive后立即返回,因为它没有阻塞。但不是这样的。使用它的reader类的版本只是在单独的线程上愉快地接收消息,直到我发出信号让它退出并且队列关闭


别误会,这很好。但是我试图理解为什么托管线程被一个单独的线程(BeginReceive)中发生的操作阻止退出,而它对此一无所知。我需要知道它是如何工作的,以便决定它是否是一种可行的、稳定的方法。托管线程是否以某种方式“知道”存在挂起的异步操作或类似操作?

您是说旧代码仍在调用Receive()?不要这样做,代码将阻塞内部锁。不,我测试了旧代码只是为了看看发生了什么。它仍在呼叫BeginRecieve()