おそらく、新しいスレッドでメソッドを呼び出し、呼び出しが時間内に完了しない場合はスレッドを強制終了します。スレッドを強制終了するのは悪いことですが、この特定のケースでは、ネイティブ関数のソースコードにアクセスできないと想定しています。
どういうわけか、Thread.Abortは機能しません(相互運用スレッドがどのように機能するかを理解しようとします)。マネージスレッドを作成する代わりに、CreateThreadを使用してネイティブスレッドを作成し、タイムアウト後に終了できます。
[DllImport("Library.dll")]
public static extern void InfiniteLoop();
[DllImport("kernel32")]
private static extern int CreateThread(
IntPtr lpThreadAttributes,
UInt32 dwStackSize,
IntPtr lpStartAddress,
IntPtr param,
UInt32 dwCreationFlags,
UInt32 lpThreadId
);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int TerminateThread(int hThread);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetLastError();
private delegate int InvokeInfiniteLoop(IntPtr args);
static void Main(string[] args)
{
InvokeInfiniteLoop invokeInfiniteLoop = (args1) =>
{
InfiniteLoop();
return 0;
};
IntPtr infiniteLoopPtr = Marshal.GetFunctionPointerForDelegate(invokeInfiniteLoop);
int handle = CreateThread(IntPtr.Zero, 0, infiniteLoopPtr, IntPtr.Zero, 0, 0);
Thread.Sleep(TimeSpan.FromSeconds(5));
int terminated = TerminateThread(handle);
Console.WriteLine(terminated);
}
注意点として、スレッドの終了は危険です。ここですべてを読むことができます:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686717 (v=vs.85).aspx 。HansPassantは正しいです。ソースが利用可能な場合は、それをデバッグしてバグを特定できます。