我正在研究一个多线程的C#Windows应用程序,该应用程序会频繁调用本机dll。这些阻止有时会持续相当长时间的呼叫。ManagedThreadID和操作系统之间的关系ThreadID
在某些情况下,我想取消从主线程的一些工作线程这些阻塞调用,我使用的原生API为此提供了一个功能:
HRESULT CancelBlockingCall(DWORD ThreadID)
虽然文档CancelBlockingCall()不是非常清楚,我相信我需要传递阻塞在调用上的OS级线程的ThreadID。根据我从CancelBlockingCall()得到的返回码,我意识到Thread.ManagedThreadID不是我所需要的。我发现msdn (see the Note)如下:
了操作系统的ThreadId有一个托管线程没有固定的关系,因为 非托管主机可以控制托管和非托管线程之间的关系。 具体而言,复杂的主机可以使用CLR主机API针对相同的操作系统线程安排多个受管理的 线程,或在不同的操作系统线程之间移动受管理的线程。
这是否意味着我无法为托管线程正确调用CancelBlockingCall()?是否无法确定托管线程当前正在执行的OS级别线程的ThreadId?
为什么选择P/Invoke?为什么不'AppDomain.GetCurrentThreadId'? – Gabe 2012-03-01 06:39:22