私はネイティブdllを頻繁に呼び出すマルチスレッドのC#Windowsアプリケーションを開発中です。これは時にはかなり長い時間がかかることがあるコールをブロックしています。特定の状況でManagedThreadIDとオペレーティングシステムThreadIDの関係
、私は私が使用しているネイティブAPIは、この目的のための機能を提供し、メインスレッドからいくつかのワーカースレッド上でこれらのブロッキング呼び出しをキャンセルしたい:のドキュメントが、
HRESULT CancelBlockingCall(DWORD ThreadID)
CancelBlockingCall()は非常に明確ではない、私は、呼び出しでブロックされているOSレベルのスレッドのThreadIDを渡す必要があると思う。私がCancelBlockingCall()から取得しているリターンコードに基づいて、私はThread.ManagedThreadIDが私が必要としているものではないことに気付きました。
管理対象外のホストの管理とアンマネージスレッド間の関係を制御することができますので、マネージスレッドへの一定の関係を持っていないスレッドIDオペレーティングシステム:私はmsdn (see the Note)に次を発見しました。 具体的には、洗練されたホストは、CLR Hosting APIを使用して、同じオペレーティングシステムスレッドに対して多くの管理された スレッドをスケジュールするか、管理対象スレッドを異なるオペレーティングシステムスレッド の間で移動できます。
これは管理されたスレッドに対してCancelBlockingCall()を正しく呼び出す方法がないことを意味しますか?管理スレッドが現在実行されているOSレベルのスレッドのThreadIdを特定することは不可能ですか?あなたはPを試みることができる
なぜP/Invokeですか?どうして 'AppDomain.GetCurrentThreadId'? – Gabe