Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Azure Worker角色中使用内核32 CreateThread/TerminateThread_C#_Azure_Dllimport_Azure Worker Roles_Native Code - Fatal编程技术网

C# 在Azure Worker角色中使用内核32 CreateThread/TerminateThread

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

我有这段代码需要使用,但阻碍我的是它说TerminateThread只适用于:桌面应用程序。 我想知道我是否可以在azure Worker角色中使用此代码,特别是在我用来运行Worker线程的
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()终止;