我需要终止一个我已经知道它的ID的特定线程,我通过获取ID来获取ID
System.Diagnostics.ProcessThread
我已经检测到我需要终止的线程ID
我该怎么办才能终止它。
答案 0 :(得分:3)
您可以使用几个P / Invoke方法执行此操作。首先,在线程上使用您找到的ID调用OpenThread
以获取其句柄:
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中。
正如评论中所提到的,强行终止一个线程通常不是你想要做的 - 使用它时要非常小心。 暂停线程允许您稍后恢复它,终止立即杀死该线程(阅读更多about why you shouldn't abort threads here)
此外,MSDN documentation on TerminateThread提及以下内容:
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);