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.

我正在运行一些多线程代码,这些代码执行以下操作

  • 在STA线程上,我创建一个 “worker”线程,并运行它
  • STA线程然后等待工作线程 线程退出
  • 工作线程调用STA COM代理上的方法 对象,然后退出
  • 在步骤2中,我使用
    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