C# 为什么Thread.Join不允许通过COM消息?
我正在运行一些多线程代码,这些代码执行以下操作C# 为什么Thread.Join不允许通过COM消息?,c#,multithreading,com,clr,sta,C#,Multithreading,Com,Clr,Sta,我正在运行一些多线程代码,这些代码执行以下操作 在STA线程上,我创建一个 “worker”线程,并运行它 STA线程然后等待工作线程 线程退出 工作线程调用STA COM代理上的方法 对象,然后退出 在步骤2中,我使用Thread.Join()等待工作线程退出 Thread.Join()的文档说明,它在继续执行标准COM和SendMessage泵送时,会在线程终止之前阻止调用线程 但是,工作线程会在COM调用上阻塞“永远”。STA线程从不为COM调用提供服务,而它在工作线程上调用thread.
Thread.Join()
等待工作线程退出
Thread.Join()
的文档说明,它在继续执行标准COM和SendMessage泵送时,会在线程终止之前阻止调用线程
但是,工作线程会在COM调用上阻塞“永远”。STA线程从不为COM调用提供服务,而它在工作线程上调用thread.Join()时被阻止
我希望STA线程能够在thread.Join上被阻止时为COM调用提供服务
有人能解释一下这里可能发生的事情吗?
以下是对Thread.Join的调用的本机调用堆栈(在本机代码调试模式下运行VS,因此差异可能是由于未使用WinDbg造成的): 以下是中所示的调用堆栈,用于调用Thread.Join的STA线程: 它似乎与我在上次通话中看到的有所不同
ntdll!NtWaitForMultipleObjects+0xa
KERNEL32!WaitForMultipleObjectsEx+0x10b
USER32!RealMsgWaitForMultipleObjectsEx+0x129
USER32!MsgWaitForMultipleObjectsEx+0x46
ole32!CCliModalLoop::BlockFn+0xbb
ole32!CoWaitForMultipleHandles+0x145
mscorwks!NT5WaitRoutine+0x77
mscorwks!MsgWaitHelper+0xed
mscorwks!Thread::DoAppropriateAptStateWait+0x67
mscorwks!Thread::DoAppropriateWaitWorker+0x195
mscorwks!Thread::DoAppropriateWait+0x5c
mscorwks!Thread::JoinEx+0xa5
mscorwks!ThreadNative::DoJoin+0xda
mscorwks!ThreadNative::Join+0xfa
以下是本文针对MTA线程的调用堆栈:
ntdll!NtWaitForMultipleObjects+0xa
KERNEL32!WaitForMultipleObjectsEx+0x10b
mscorwks!WaitForMultipleObjectsEx_SO_TOLERANT+0xc1
mscorwks!Thread::DoAppropriateAptStateWait+0x41
mscorwks!Thread::DoAppropriateWaitWorker+0x195
mscorwks!Thread::DoAppropriateWait+0x5c
mscorwks!Thread::JoinEx+0xa5
mscorwks!ThreadNative::DoJoin+0xda
mscorwks!ThreadNative::Join+0xfa
您的工作线程是否在MTA公寓中运行?如果当前单元是MTA,则Thread.Join将不会执行泵送。在这种情况下,MSDN上的文档具有误导性,因为不在MTA中泵送是标准的 这里有一篇关于这个主题的文章
编辑重新阅读问题,发现阻塞线程是STA线程。将答案保留为CW,以防它帮助人们以所描述的方式解决问题。线程正在STA线程中调用Join。我认为工人就是MTA——不管默认值是什么。你的评论仍然适用吗?答案是对Chris Brumme文章的间接链接投了赞成票,尽管如此,这可能会有所帮助……我认为这很有趣,也很可怕。您是否可以附加一个本机调试器(带有完整的符号——如果您还没有“Microsoft symbol server”的话,请使用Google),并查看Thread.Join STA的调用堆栈是否与参考文章中显示的匹配?
ntdll!NtWaitForMultipleObjects+0xa
KERNEL32!WaitForMultipleObjectsEx+0x10b
mscorwks!WaitForMultipleObjectsEx_SO_TOLERANT+0xc1
mscorwks!Thread::DoAppropriateAptStateWait+0x41
mscorwks!Thread::DoAppropriateWaitWorker+0x195
mscorwks!Thread::DoAppropriateWait+0x5c
mscorwks!Thread::JoinEx+0xa5
mscorwks!ThreadNative::DoJoin+0xda
mscorwks!ThreadNative::Join+0xfa