2009-06-22 4 views
0

Не так давно я спросил об ошибке msg, которая произошла, когда app.PriorityClass =? был до app.start. Очевидно, решение, которое мне не нравилось, это написать его после начала.Запустите процесс с низким приоритетом. Возможно ли это без попыток?

Он работал без особых проблем до сегодняшнего дня. Я получаю запрос «Не могу обработать запрос, потому что процесс вышел». исключение, потому что процесс завершается достаточно быстро, чтобы не изменить его приоритет (иногда). Обернуть попытку вокруг это плохо. Какое реальное решение? как я запускаю процесс с низким приоритетом?

  Process app = new Process(); 
      app.StartInfo.FileName = @"bin\convert.exe"; 
      app.StartInfo.Arguments = string.Format("{0} -resize 150x150 {1}", filename, thumbName); 
      //app.PriorityClass = ProcessPriorityClass.BelowNormal; //No process is associated with this object. 
      app.Start(); 
      //app.PriorityClass = ProcessPriorityClass.BelowNormal; //"Cannot process request because the process has exited." 

ответ

0

Любой тест, который вы можете сделать, это немедленно быть условием гонки; если приложение быстро выйдет, единственной безопасной вещью, которую я могу придумать, является использование try/catch.

Если это не прочитано из stdio? В этом случае вы можете перенаправить его и намеренно не закрыть входной поток, пока не измените приоритет.

2

Ваш выбор:

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

Потому что даже когда вы проверяете, процесс все равно может выйти из-под контроля и при попытке установить его. Итак, действительно, просто пойдите с опцией №1, потому что это меньше кода.

1

Почему вы хотите избежать ловушек и условий исключения, с которыми вы знаете, как бороться с минимально возможным уровнем? Если вы можете установить приоритет, отлично! Если нет, процесс завершится, и ваша работа будет завершена. Я не думаю, что есть какая-то причина, чтобы попытаться избежать надлежащего обращения с ошибкой.

+0

Проблема не является исключением. Проблема в том, что исключение выбрасывается. Это означает, что я не могу так легко сломаться при вызове InvalidOperationException, так как мы ожидаем, что оно будет выброшено. –

-1

Вы всегда могли бы использовать, если заявление:

if (!app.HasExited) 
{ 
    app.PriorityClass = ProcessPriorityClass.BelowNormal; 
} 

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

+3

Здесь все еще есть состояние гонки :) – AakashM

2

Решение: запустите процесс приостановлено, затем измените приоритет, а затем возобновите процесс.

Это делается в Win32 с CREATE_SUSPENDED в вызове CreateProcess, но, к сожалению, я не знаю, как .NET.