2013-02-08 2 views
0

там множество разных примеров, плавающих вокруг SO, с использованием mutex, Environment.Exit(0) (консольное приложение), Application.Exit() (Win формы) и лот, в котором говорится, что не использовать process.kill().Правильный способ закрыть дополнительные экземпляры процесса?

Может ли кто-нибудь объяснить политическую неточность того, как я закрываю ДРУГИЕ экземпляры моего заявления. Это приложение для окон. Это, кажется, отлично работает в моей локальной среде, но я боюсь, что есть некоторые серьезные проблемы, о которых я не знаю.

// I get the current process name and ID 
    string currentProcName = Process.GetCurrentProcess().ProcessName; 
    int currentProcID = Process.GetCurrentProcess().Id; 

    // I then get a list of all process running under this name 
    Process[] currentProcess = Process.GetProcessesByName(currentProcName); 

    foreach (Process proc in currentProcess) 
    { 
     // if the found process id is using the same name, but not this current id, kill it. 
     if (proc.Id != currentProcID) 
     { 

      proc.Kill(); // Documentation says it imediatly stops the associated process. 
      proc.Close(); // Documentation says that it frees all resources associated with this component 

     } 
    } 

Согласно документации, я думаю, что это разумный способ закрыть ДРУГИЕ экземпляры запущенного приложения. Могли бы некоторые более опытные указать на некоторые проблемы, если они есть? Помимо атомарности, как я добавлю в обработку исключений.

+0

Ну, часть этого сводится к пониманию того, что делает другой процесс, и если это возможно или, вероятно, окажется посреди чего-то, что нужно закончить. Вот почему нехорошо предлагать решения, подобные этому, широкой аудитории как * * решение. Если вы знаете, что в вашем случае нет постоянных данных, оставшихся в несогласованном состоянии или что-либо в этих строках, это возможно *, что это приемлемо в ваших обстоятельствах. – Servy

+0

Целью этого является запуск одного экземпляра приложения? При каких условиях вы хотите убить другие сестринские процессы? –

+0

Благодарим за разрешение Servy. @JohnArlen Я создаю aC# исполняемый файл для неуправляемого собственного приложения, и я хотел бы разрешить родному приложению запускать программу в режиме отладки или в режиме запуска (один показывает интерфейс программы, другой скрывает все), вызывая exe из на родном языке, передавая ему аргумент команды «Debug» или «Run». Этот сценарий возникает, когда я хочу убить предыдущую версию приложения форм выигрышей, открыв другой экземпляр. Он отлично работает на моей тестовой среде, но мы все знаем, что это может измениться! – clamchoda

ответ

0

я должен отложить Раймонд Чен здесь для справки:

Закрытия процесса в духе сотрудничества, безусловно, лучшего способ избавиться от it: Это позволяет обеспечить надлежащее выключение/закрытие. Убийство процесса в основном вызывает TerminateProcess, в котором останавливает независимо от того, что он делает, и убивает bugger.

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