Process.Start Иногда требуется много времени, чтобы вернуться - PullRequest
0 голосов
/ 23 марта 2011

У меня странная проблема в приложении, которое я пишу.

Он читает основной файл конфигурации xml, создает локальную копию для пользователя, а затем выполняет некоторые действия, описанные в файле xml. Он проверяет, нуждается ли обновление в локальном XML-файле, поэтому не нужно делать это каждый раз.

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

Одним из действий является импорт файла .reg в реестр. Я делаю это так:

Process regeditProcess = Process.Start("regedit.exe", "/s " + RegFilePath);
regeditProcess.WaitForExit();
regeditProcess.Close();

У меня проблема в том, что если приложение создает новый файл конфигурации, тогда процесс regedit может занять до 30 секунд. Если он не создает его, он завершается в течение секунды.

В цикле, который проверяет завершение потоков, я поместил

Application.DoEvents();

Если я не сделаю этого, процесс regedit запустится, и если я подожду достаточно долго, я получу сообщение об обнаружении ContextSwitchDeadlock отладчика. Я попытался использовать другой файл .reg и только запустить это одно действие, но все тот же.

Создание xml-файла происходит в главном рабочем потоке до того, как предприняты какие-либо действия, но я уверен, что это как-то на него влияет, я просто не уверен, что именно.

Я знаю, что это немного странный сценарий, но кто-нибудь уже сталкивался с чем-то подобным?

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Я решил, в чем проблема, у меня была директива STAThread в Program.cs.Как только я вынул это, это сработало.

STAThread и многопоточность

http://ilvyanyatka.spaces.live.com/blog/cns!EA0C02AB2E2FCFAC!193.entry?wa=wsignin1.0&sa=143328961

0 голосов
/ 23 марта 2011

Вы явно закрываете объект записи файлов после создания файла конфигурации?Если нет, возможно, вы блокируете файл, блокируя доступ вашего работника.

...