2013-04-19 4 views
2

У меня есть рабочий стол, который копирует некоторые файлы. После завершения копирования файлов я хочу запустить приложение. Проблема, с которой я сталкиваюсь, заключается в том, что при копировании файлов он вызывает код для запуска приложения, поэтому он запускается в ошибке использования файла. Есть ли проверка, которую я могу сделать, чтобы убедиться, что определенный метод вызывается только тогда, когда фоновый работник завершен?Дождитесь завершения рабочего стола перед вызовом метода

private void LaunchApplication(string targetPath, string targetExecutable) 
    { 
      CopyFiles(); 

      Process.Start(Path.Combine(targetPath, targetExecutable)); 
    } 

CopyFiles вызывается в методе DoWork для BackGroundWorker. Я хочу, чтобы это было полностью finsih до вызова Process.Start .... Теперь у меня есть несколько исполняемых файлов, привязанных к нескольким кнопкам, поэтому я не могу поместить Process.Start ... в событие RunWorkerCompleted.

+3

Вы использования события [RunWorkerCompleted] (http://msdn.microsoft.com/en-gb/library/system.componentmodel.backgroundworker.runworkercompleted.aspx)? – DGibbs

+0

Вы можете проверить, что файлы были скопированы перед запуском приложения. –

+0

@DGibbs - Да, но проблема в том, что у меня есть несколько приложений, которые могут быть запущены, и я не могу сказать, какой из них есть, пока пользователь не нажмет одну из кнопок запуска. – Xaisoft

ответ

1

Если вы положили CopyFiles() в фоновый поток, следующая строка кода будет выполнена, поэтому в вашем случае я бы не использовать фона рабочего. Вместо этого я блокировал бы до завершения копирования файлов, а затем запускал приложение. Поместите какое-то окно, рассказывающее о ваших потребностях, чтобы немного подождать.

Если вам нужно подождать и до сих пор использовать фоновую рабочий, то CopyFiles() должен быть в DoWork обработчике и Process.Start должна быть BackgroundWorker.RunWorkerCompleted события.

MSDN на RunWorkerCompleted

RunWorkerCompleted

Stack Overflow Пример на Выполнил:

Run Worker Completed Sample Code

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

Stack Overflow Global Mutex Question

+0

Проблема, с которой я сталкиваюсь с процессом Process.Start в RunWOrkerCompleted, состоит в том, что существует около 6 кнопок, запускающих разные приложения, и я понятия не имею, какой пользователь щелкнул. – Xaisoft

+0

@Xaisoft - вы можете добавить обработчики кликов для каждой кнопки или один обработчик для всех из них. Обработчик будет иметь аргумент «отправитель объекта», который передается. Передайте его кнопке, и вы можете найти имя кнопки, если используете общий подход обработчика. –

+0

Итак, скопируйте ли вы файлы при нажатии кнопки или просто откройте exe? если вы копируете файлы, вы можете передать исполняемый путь в качестве аргумента для рабочего фона. Если вы просто открываете кнопку EXE при нажатии кнопки, то просто проверьте, занят ли фоновый рабочий с 'bgw.IsBusy' – kschieck