2010-11-04 5 views
0

Я написал службу Windows, которая контролирует таблицу базы данных для ожидающих заданий и порождает потоки для запуска этих заданий, и каждый из этих потоков в свою очередь запускает процесс для выполнения фактической работы (этот процесс является служебной программой Microsoft, а не обычным один). Это отлично работает, но если одна из заданий занимает больше времени, чем обычно, я бы хотел убить эту работу.Как убить процесс, запущенный из потока (созданного threadpool) в C#?

Как это можно сделать? Нужно ли прервать поток или уничтожить процесс, запущенный потоком? Мне также нужно сохранить стандартный вывод этого процесса в текстовом файле. Для этого я использую следующий код.

using (Process process = Process.Start(startInfo)) 
{ 
    LogToTextFile(process.StandardOutput.ReadToEnd()); 
    process.WaitForExit(); 
    exitCode = process.ExitCode; 
} 

Возможно ли нить проверить флаг в той же таблице и убить запущенный процесс, так что не нужно быть прервана? Я использую ThreadPool.QueueUserWorkItem для создания темы. Что является самым надежным способом остановить эти запущенные процессы, не останавливая службу Windows?

ответ

6

Process.Kill - это то, что вы ищете. Убивание потока было бы неразумным и не повлияло бы на процесс, который он запускал.

Предполагая, что вы хотите ждать 60 секунд для завершения процесса, вы могли бы использовать это:

using (Process process = Process.Start(startInfo)) 
{ 
    LogToTextFile(process.StandardOutput.ReadToEnd()); 

    if(process.WaitForExit(60000)) 
    { 
     exitCode = process.ExitCode; 
    } 
    else 
    { 
     process.Kill(); 
    } 
} 

Чтобы быть вдвойне ясно, не убить ThreadPool нить.

+0

Вы еще там. – xcud

+0

@ xcud: Хорошая добыча; Благодарю. –

+0

спасибо за ответ, но решение о том, следует ли убить процесс, берется пользователем и хранится в флагове в таблице, это не определенный срок. также я заметил, что когда я вызываю process.StandardOutput.ReadToEnd(), эта строка сама ждет, пока процесс не завершится, и элемент управления не будет передан следующей строке. поэтому я не уверен, что этот код будет работать. Я попробую это. – RKP

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