C # Блокировать код до тех пор, пока процесс не обработает дескриптор файла - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть цикл foreach, который запускает процесс в try / catch.В разделе finally моего try / catch / finally я пытаюсь убедиться, что у процесса нет дескриптора ни в одном из файлов.Я должен удалить файлы, которые обрабатывались.

Кажется, ничего из того, что я пробовал, не работает.Я продолжаю получать исключения System.IO.«Файл в настоящее время используется другим процессом.»

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

Спасибо!

try
{
   foreach (var fileInfo in jsFiles)
   {
     //removed for clarity
     _process.StartInfo.FileName = "\"C:\\Program Files\\Java\\jre6\\bin\\java\"";
     _process.StartInfo.Arguments = stringBuilder.ToString();
     _process.StartInfo.UseShellExecute = false;
     _process.StartInfo.RedirectStandardOutput = true;
     _process.Start();
   }
 }
 catch (Exception e)
 {
   BuildMessageEventArgs args = new BuildMessageEventArgs("Compression Error: " + e.Message,
                                string.Empty, "JSMin", MessageImportance.High);
   BuildEngine.LogMessageEvent(args);

 }
 finally
 {
   _process.WaitForExit();
   _process.Close();
 }

Ответы [ 4 ]

3 голосов
/ 19 ноября 2010

Здесь что-то серьезно не так.Вы запускаете кучу процессов, но ожидаете, пока не выйдет last .

Вы уверены, что не хотите, чтобы foreach находился за пределами блока try?

Если вы расскажете нам больше о том, что именно вы пытаетесь сделать, мы могли бы предложить вам лучшие предложения.

2 голосов
/ 19 ноября 2010

Я думаю, вам нужно реструктурировать свой код. Поскольку он терпит неудачу, любой из процессов в foreach приведет к выходу из цикла. Даже если все выполнится успешно, ваши вызовы WaitForExit и Close в блоке finally будут адресованы только последнему процессу из цикла выше.

Вам необходимо иметь дело с каждым процессом, его успехом и / или провалом в отдельности. Создайте метод, который принимает параметр fileInfo и порождает и ожидает каждого процесса. Переместите ваш цикл в код клиента, который будет вызывать предложенный метод.

0 голосов
/ 19 ноября 2010
foreach (var fileInfo in jsFiles)
{
    using (Process process = new Process())
    {
        try
        {
            //Other stuff
            process.Start();
        }
        catch (...)
        {
            //Exception Handling goes here...
        }
        finally
        {
            try
            {
                process.WaitForExit();
            }
            catch (...)
            {
            }
        }
    }
}
  1. Process.WaitForExit() может выдать исключение, поэтому ему нужна собственная попытка / отлов.
  2. Если вы создаете процесс в операторе using, вам не нужно беспокоиться о его закрытии, .NET правильно его утилизирует.
  3. Обычно лучше не ставить перед локальными переменными символ подчеркивания. Большинство людей просто используют это для своих полей.
0 голосов
/ 19 ноября 2010

Является ли процесс консольным приложением или приложением с графическим интерфейсом?

Для приложения с графическим интерфейсом вам нужно выполнить Process.CloseMainWindow.

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