Process.Kill () и обрабатывать события - PullRequest
4 голосов
/ 24 января 2012

Вот ситуация: мне нужно создать программу, которая будет вводить поток вывода другого процесса в текстовое поле.Само по себе это не вызовет особых проблем.Что, однако, является тем фактом, что мне нужно запустить 5 экземпляров этого консольного приложения и перенаправить вывод в 5 текстовых полей, а также иметь возможность убить любой из этих процессов в любое время.Насколько я понял, лучший способ сделать это - асинхронно.Но проблема здесь в процессах уничтожения, которые созданы в другом потоке.Как я могу убить его, не имея доступа к нему, поскольку он не существует в области, где я должен убить его.Мое лучшее предположение - получить его PID на Process.Start(), чтобы я мог его убить, так что ...

Возможно ли запустить любое событие из процесса по команде Process.kill()?А если нет - есть ли способ убить процесс примерно в тот же промежуток времени, что и Process.Kill(), который запускает какое-то событие?

Или, может быть, кто-то мог бы предложить мне другие подходы или лучшие практики о том, какэти проблемы обычно решаются?

РЕДАКТИРОВАТЬ: причина, по которой я запускаю все процессы в разных потоках, заключается в том, что я использую Thread.Sleep() для некоторых из них, если есть и входной параметр, который говорит мне, что процесс должен быть завершен через x секунд.

Ответы [ 3 ]

1 голос
/ 30 января 2012

Process.Kill () по какой-то причине действительно запускает событие выхода из процесса.Самым простым способом узнать, что процесс был убит, было создание изменчивой строки, содержащей информацию о том, как он закончился.(Измените его на «убитый» перед process.kill и т. Д.)

0 голосов
/ 24 января 2012

Когда вы вызываете

Process.Start() 

, он возвращает экземпляр класса Process, который вы можете использовать для извлечения информации из его вывода и завершения этого процесса в любое время

Process p = Process.Start("process.exe");
//some operations with process, may be in another thread
p.Kill()
0 голосов
/ 24 января 2012

Прежде всего вам не нужны темы вообще. Запуск процесса сам по себе асинхронный, поэтому Process.Start (...) не блокируется, и вы можете создать столько процессов, сколько захотите.

Вместо использования статического метода Process.Start следует рассмотреть возможность создания экземпляров класса Process и установить для свойства CanRaiseEvents значение true. Кроме того, есть пара событий, которые вы можете зарегистрировать (для каждого экземпляра) - они будут возникать только в том случае, если CanRaiseEvents установлен в значение true, но также и после выхода из процесса (включая вызовы Kill ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...