在Azure辅助角色中使用kernel32 CreateThread / TerminateThread

时间:2012-08-20 18:54:51

标签: c# azure dllimport azure-worker-roles native-code

我有这个代码需要使用,但是让我回想的是here它表示TerminateThread 适用于:仅限桌面应用。 我想知道我是否可以在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();

终止

1 个答案:

答案 0 :(得分:3)

“仅适用于:桌面应用程序”是指Windows 8桌面应用程序与Windows 8 Metro应用程序之间的区别。