使用する必要があるこのコードがありますが、私を妨げているのは、 TerminateThread Applies to: desktop apps onlyと書かれていることです。このコードを azure Worker ロール内、特にWorker スレッドを実行するために使用するプロセス内で使用できるのだろうか?waiishost.exe
[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);
}
編集:
さらなる調査の結果、(最初から疑っていたように)この回避策は完全に間違っているようです。アンマネージ コードを作成して終了すると、スタックがリークします。Process.Kill(); によって終了される別の実行可能ファイルを作成する必要があります。