2015-02-03 3 views
1

Мне нужно прекратить конкретную тему, которую я уже знаю, это идентификатор, я получаю идентификатор, получая System.Diagnostics.ProcessThread , и я уже обнаружил идентификатор потока, который мне нужен для завершения что я могу сделать, чтобы его прервать.Убивать/прерывать конкретный поток, используя его ID в C#

+1

Вы пытаетесь прервать поток работает в другом процессе? – Gusdor

+7

Ваш вопрос звучит как * как стрелять по моей ноге? * Можете ли вы объяснить, что вы пытаетесь сделать вместо этого? Зачем вам нужно прекратить поток? –

+0

У вас есть ответ, используя 'TerminateThread' [ниже] (http://stackoverflow.com/a/28295713/2530848). Вы можете использовать его, если вы действительно знаете, что он делает и каковы последствия. Вряд ли вы можете узнать о последствиях «TerminateThread», когда вы не знаете о существовании такой функции. –

ответ

3

Вы можете сделать это с помощью пары методов P/Invoke. Во-первых, вызовите 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 блока, если вы окружив его в попытке/уловке.

Как уже упоминалось в комментариях, принудительное завершение потока, как это, обычно не то, что вы хотите сделать - будьте очень осторожны при использовании этого. Приостановка нить позволяет возобновить его на более позднем этапе, Нагрузочный немедленно убивает нить (далее 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); 
+0

Где вы заканчиваете тему? Я этого не вижу. –

+0

@SriramSakthivel. Вы правы, также включили 'TerminateThread'. – aevitas

+0

Примечание: для тех, кто задается вопросом, что такое 'ThreadAccess', это просто' uint'. –

Смежные вопросы