2016-01-21 3 views
1

У меня есть процесс A, который запускает процесс B. Процесс B изменяет некоторые файлы процесса A, поэтому мне нужна задержка в процессе B, чтобы процесс A закрылся.Задержка начала процесса до завершения родительского процесса

На данный момент я основал два решения.

Решение 1: цитата из link «Единственный способ, которым я могу думать, это написать вторую программу, которая ждет 30 секунд и загружает нужную программу, вы вызываете эту программу и закрываете первую программу, вторая ждет 30 секунд затем загружает тот, который вы хотели в первую очередь ».

Эта работа, но третья программа немного плохая, если вы знаете, что я имею в виду.

Решение2: Просто, просто поместите Thread.Sleep в процессе B до начала логического запуска (у меня есть контроль над процессами A и B). Эта работа тоже, и это не плохой идеей ...

Я спрашиваю, потому что я ищу способ передать параметры при вызове на процессы A на processB.start, так что это может быть более чистое/элегантное решение ,

+0

Что вы пробовали? Можете ли вы поделиться своим кодом с тем, как вы начинаете свои процессы? Будет ли ['Process.WaitForExit()'] (https://msdn.microsoft.com/en-us/library/fb4aw7b8 (v = vs.110) .aspx) работать? Как следует из названия, он запускает процесс, а затем выполняет все выполнение до тех пор, пока этот процесс не завершится, затем он возобновится. – sab669

+0

Это не работает для меня, мне нужен процесс A Перед тем, как запустить B-версию, Process.WaitforExit() - это наоборот. Повторяю, процесс B попытается изменить файлы процесса A, если процесс A запущен, процесс B не сможет выполнить изменения. – Aferrercrafter

+1

Передайте PID процесса A для обработки B, откройте процесс из B, а затем выполните WaitForExit(), затем выполните модификацию файла – Gusman

ответ

2

Существует 2 реальных способа сделать это.

Во-первых, вы можете использовать объекты синхронизации уровня ОС, такие как Mutex. В первом приложении создайте новое имя Mutex и release перед закрытием приложения. Во втором приложении ждут Mutex, выпущенный WaitOne.

Первый процесс должен создать новый семафор и блокировать другие процессы:

Mutex mtx = new Mutex(true, "SomeName"); 
// start second process 
mtx.ReleaseMutex(); 

Второй процесс:

Mutex mtx = new Mutex(false, "SomeName"); 

// next line will block current thread until mutex will be released 
mtx.WaitOne(); 

// your logic here 

Также вы можете check running processes в вашем втором приложении и ждать, когда первое приложение будет закрыто:

while(Process.GetProcessesByName("YourFirstProcessName").Any()) 
{ 
    Thread.Sleep(1000); 
} 

Имейте в виду, что оба решения включают в себя накладные расходы потому что Mutex является объектом синхронизации уровня операционной системы, а Process.GetProcessesByName также вызывает внешний API.

+0

Зачем усложнять очень простую задачу, используя именованные мьютексы, когда вы можете просто ждать завершения процесса? – Gusman

+0

@Gusman Вы можете дождаться завершения процесса из кода инициатора, но в сценарии вопроса нам нужно будет выйти из кода приложения-инициатора. –

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