使用c#中的ID杀死/中止特定线程

时间:2015-02-03 09:38:06

标签: c# multithreading thread-safety thread-abort

我需要终止一个我已经知道它的ID的特定线程,我通过获取ID来获取ID System.Diagnostics.ProcessThread 我已经检测到我需要终止的线程ID 我该怎么办才能终止它。

1 个答案:

答案 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);