2014-11-07 2 views
0

Проблема заключается в том, как отслеживать процесс, который я запускаю из своего приложения.Как отслеживать процесс

Я делаю «пусковую установку», и я хотел бы отслеживать, когда программа, которую я запускаю, закрыта.

Я проверил эти ссылки, но я думаю, что это не совсем то же самое, что я пытаюсь, потому что процессы, которые я запускаю, - все они javaw.exe, и мне нужно обрабатывать их по отдельности.

.Net Process monitor

How to detect a process start & end using c# in windows?

Это как код выглядит сейчас:

{ 
    Process proc = new Process(); 
    proc.Exited += EclipseInstanceClosed; 
    proc.Disposed += EclipseInstanceDisposed; 
    // this property is a *.exe path: 'C:\eclipse\eclipseV4.4.1\eclipse.exe' for example 
    proc.StartInfo.FileName = SelectedEclipseInstance.Exec; 
    proc.StartInfo.UseShellExecute = true; 

    proc.Start(); 
} 

...

void EclipseInstanceClosed(object sender, EventArgs e) 
{ 
    MessageBox.Show("Eclipse was closed!"); 
} 

void EclipseInstanceDisposed(object sender, EventArgs e) 
{ 
    MessageBox.Show("Eclipse was disposed!"); 
} 

Но эти события не возникает, когда я закрываю программу ,

Есть идеи?

Update:

Я также попытался это решение (why Process's Exited method not being called?) с proc.EnableRaisingEvents = true;, но без успеха

Update II:

я модифицировал код так начинается процесс в рамках задачи. В этом случае события поднимаются. Какова причина?

LaunchEclipseProcess(); 

...

private async void LaunchEclipseProcess() 
{ 
    await Task.Run(() => 
    { 
     Process proc = new Process(); 
     proc.EnableRaisingEvents = true; 
     proc.StartInfo.UseShellExecute = true; 

     proc.Exited += EclipseInstanceClosed; 
     proc.Disposed += EclipseInstanceDisposed; 

     proc.StartInfo.FileName = SelectedEclipseInstance.Exec; 

     proc.Start(); 
    }); 
} 
+2

Вы сохраняете ссылку на объект 'proc', который вы создаете? –

+0

№ Объект создается в событии doubleclick. – blfuentes

+0

Я думаю, что проблема в том, что когда вы выходите из блока кода, о котором вы упомянули, вы теряете ссылку на 'proc', и это сбор мусора. попробуйте определить свой «proc» вне вашего блока и проверить результат – dotctor

ответ

0

Вы пробовали

proc.WaitForExit()

Вы даже можете запустить proc.WaitForExit() в другом потоке, если вам нужно, чтобы остальная часть кода продолжала выполнять и запускать метод EclipseInstanceClosed после его завершения.

Если процесс фактически остановился, этот метод вернется. Если он никогда не возвращается, это означает, что процесс никогда не останавливался. Затем вам нужно устранить неполадки, почему это не останавливается.


Перед запуском первого экземпляра вашего приложения, получить список всех запущенных javaw.exe и их PIDs. Сохраните этот список. После запуска нового экземпляра вашего приложения перепроверьте список javaw.exe. Найдите новый. Создайте «ссылку» на этот процесс, чтобы контролировать его, как будто вы написали свой код выше.

var proc = Process.GetProcessById (id);

Следите за этим и делайте свои дела.

Если вы запустите новый процесс, повторите приведенную выше логику. Перечислите все javaw.exe прямо перед и сразу после получения вашего Process.Id для мониторинга.

Если каждый javaw.exe запущен с аргументами, есть способы получить эти аргументы, а также сузить целевой процесс, если приведенный выше метод недостаточно хорош.

+0

процесс. WaitForExit() может использоваться только для отслеживания завершения или завершения процесса запуска. Но OP запускает приложение eclipse, и он хочет знать, когда это запущенное приложение закрыто. – Kurubaran

+0

Ах. Я не знаком с тем, как Eclipse работает с его запущенными процессами. Я предполагаю, что его один длинный жизненный процесс запускает несколько «приложений». Если затмение не закрывается, когда приложение закрывается, его код выше не работает вообще. Этот код предназначен для закрытия процесса. – Wolf5

0
proc.Exited += EclipseInstanceClosed; 

Обратите внимание, что указанный выше код не будет уведомлять о закрытии запущенного приложения. process.Exited Событие используется для того, чтобы узнать, когда соответствующий процесс завершен (процесс, вызванный вызовом Process.Start()). Но если вы хотите проверить запущенное/запущенное приложение, вы можете написать код мониторинга, как показано в вашем событии EclipseInstanceClosed.

void EclipseInstanceClosed(object sender, EventArgs e) 
{ 
    while (true) 
    { 
    Process runningEclipseProcess = Process.GetProcessesByName("ExclipeProcessName").FirstOrDefault(); 

    if (runningEclipseProcess != null) 
    { 
     //Exclipe is not closed. Wait for 1 sec and check again. 
     Thread.Sleep(1000); 
    } 
    else 
    { 
     //Exclipe is closed. Notify the user 
     MessageBox.Show("Eclipse was closed!"); 
     break; 
    } 
    }  
} 
+1

это не работает, если у вас есть несколько экземпляров того же приложения с тем же именем процесса. – dotctor

+0

@HamidP Согласовано. Пока OP не имеет такого сценария, все должно быть хорошо. – Kurubaran

+1

Как я уже сказал, все процессы - это «javaw.exe», а также я не могу идентифицировать индивидуально по имени процесса, потому что, если я запускаю разные экземпляры одного и того же exec, они имеют одинаковое имя. – blfuentes

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