我正在研究一個多線程的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