C# 在Azure Worker角色中使用内核32 CreateThread/TerminateThread
我有这段代码需要使用,但阻碍我的是它说TerminateThread只适用于:桌面应用程序。 我想知道我是否可以在azure Worker角色中使用此代码,特别是在我用来运行Worker线程的C# 在Azure Worker角色中使用内核32 CreateThread/TerminateThread,c#,azure,dllimport,azure-worker-roles,native-code,C#,Azure,Dllimport,Azure Worker Roles,Native Code,我有这段代码需要使用,但阻碍我的是它说TerminateThread只适用于:桌面应用程序。 我想知道我是否可以在azure Worker角色中使用此代码,特别是在我用来运行Worker线程的waiHost.exe进程中 [DllImport("Library.dll")] public static extern void InfiniteLoop(); [DllImport("kernel32")] private static extern int CreateThread( In
waiHost.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()终止 适用于:仅适用于桌面应用程序”指的是Windows 8桌面应用程序和Windows 8 Metro应用程序之间的区别。好的,但这并不能真正回答问题。它是:这意味着您可以调用这些API。或者更好,只需使用.NET线程API…@JasonMalinowski感谢您的评论,但是如果文档说“TerminateThread是一个危险的函数,应该只在最极端的情况下使用”呢?终止运行在WAISHOST.exe中的线程有多危险?终止运行在任何地方的线程都是危险的,而不仅仅是在WAISHOST.exe中。线程可能持有锁,持有内存,在一个多步骤过程的中途留下不一致的数据。@user1561202:处理这种情况的工业方法是在一个单独的进程中运行crapware,并在出现任何错误时终止该进程。让我引用文档:“TerminateThread是一种危险的功能,只能在最极端的情况下使用。“医生说得对!请研究这个问题。@usr这是一个极端的情况。有关更多信息,请参见:好的,但您仍在冒险:如果本机库已锁定,或临时违反了其他状态不变量,它将无法恢复自身。你的过程被冲洗了。只是要知道结果可能是什么。在进一步的研究之后(正如我从一开始就怀疑的那样),这种解决方法是完全错误的。创建和终止非托管代码将泄漏堆栈。我必须创建一个单独的可执行文件,该文件将由Process.Kill()终止;