我需要终止一个我已经知道它的 ID 的特定线程,我通过获取它来获取 ID,
System.Diagnostics.ProcessThread
并且我已经检测到我需要终止的线程 ID 我可以做些什么来终止它。
问问题
5336 次
1 回答
3
您可以使用几个 P/Invoke 方法来做到这一点。首先,OpenThread
使用您找到的 ID 调用线程以获取它的句柄:
IntPtr handle = OpenThread(THREADACCESS_SUSPEND_RESUME, false, (uint)thd.Id);
然后SuspendThread
使用刚刚获得的句柄调用:
if (handle != IntPtr.Zero)
var suspended = SuspendThread(threadHandle) == -1
这暂停了线程 - 即。它将不再运行。如果你拼命想强行杀死它,你可以调用TerminateThread
手柄:
TerminateThread(handle, 0); // Or any other exit code.
确保在完成后关闭句柄,例如,finally
如果您将其包装在 try/catch 中,则在块内。
正如评论中提到的,像这样强行终止线程通常不是您想要做的 - 使用它时要非常小心。暂停线程允许您稍后恢复它,终止会立即终止线程(阅读更多关于为什么您不应该在此处中止线程的信息)
此外,有关 TerminateThread 的 MSDN 文档提到以下内容:
TerminateThread 是一个危险的函数,只能在最极端的情况下使用。仅当您确切知道目标线程在做什么时才应该调用 TerminateThread,并且您控制了目标线程在终止时可能正在运行的所有代码。
P/调用:
[DllImport("kernel32.dll",SetLastError=true)]
static extern int SuspendThread(IntPtr hThread);
[DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle,
uint dwThreadId);
[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
static extern bool TerminateThread(IntPtr hThread, uint dwExitCode);
于 2015-02-03T09:43:19.987 回答