Начать процесс с низким приоритетом. Возможно ли это без try-catch? - PullRequest
0 голосов
/ 22 июня 2009

Не так давно я спросил об ошибке, которая произошла, когда 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."

Ответы [ 5 ]

2 голосов
/ 23 июня 2009

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

Это делается в Win32 с помощью CREATE_SUSPENDED при вызове CreateProcess, но, к сожалению, я не знаю, как это сделать .NET.

2 голосов
/ 22 июня 2009

Ваш выбор:

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

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

1 голос
/ 22 июня 2009

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

0 голосов
/ 22 июня 2009

Вы всегда можете использовать оператор if:

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

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

0 голосов
/ 22 июня 2009

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

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

...