Sunday 22 April 2018

Process start waitforexit


ProcessStartInfo висит на & quot; WaitForExit & quot ;? Зачем?
У меня есть следующий код:
Я знаю, что результат процесса, который я запускаю, составляет около 7 МБ. Запуск его в консоли Windows отлично работает. К сожалению, программно это бесконечно зависает em WaitForExit. Обратите внимание, что это также делает код НЕ зависает для меньших выходов (например, 3 КБ).
Возможно ли, что внутренний StandardOutput em ProcessStartInfo не может буферизовать 7MB? Если да, то что мне делать вместо этого? Если нет, что я делаю неправильно?
17 ответов.
Проблема в том, что если вы перенаправляете StandardOutput и / или StandardError, внутренний буфер может стать полным. Какой бы порядок вы ни использовали, может возникнуть проблема:
Если вы дождались завершения процесса перед чтением StandardOutput, процесс может блокировать попытку записи на него, поэтому процесс не заканчивается. Если вы читаете из StandardOutput с помощью ReadToEnd, тогда ваш процесс может блокироваться, если процесс никогда не закрывается StandardOutput (например, если он никогда не завершается или блокируется при записи на StandardError).
Решение заключается в использовании асинхронных чтений, чтобы гарантировать, что буфер не будет заполнен. Чтобы избежать каких-либо взаимоблокировок и собрать весь вывод из StandardOutput и StandardError, вы можете сделать это:
EDITAR: см. ответы ниже о том, как избежать ObjectDisposedException, если произойдет таймаут.
документация для Process. StandardOutput говорит, чтобы прочитать, прежде чем ждать, иначе вы можете зайти в тупик, сниппет скопирован ниже:
Ответ Desde Mark Byers превосходный, но я бы просто добавил следующее: делегаты OutputDataReceived и ErrorDataReceived необходимо удалить до того, как будут удалены функции outputWaitHandle и errorWaitHandle. Если процесс продолжает выводить данные после того, как таймаут был превышен, а затем завершен, к ним будут доступны выходные переменные outputWaitHandle и errorWaitHandle после того, как они будут удалены.
(М м м м э э э э э э э и и и и и и и и
Проблема с необработанным объектом ObjectDisposedException возникает, когда процесс истекает. В этом случае другие части условия:
не выполняются. Я решил эту проблему следующим образом:
Роб ответил и спас мне несколько часов испытаний. Прочитайте буфер вывода / ошибки перед ожиданием:
У нас есть эта проблема (или вариант).
1) Добавьте тайм-атт в p. WaitForExit (nnnn); где nnnn находится в миллисекундах.
2) Поместите вызов ReadToEnd перед вызовом WaitForExit. Это то, что мы видели в MS.
Это более современное, решение для параллельной библиотеки задач (TPL) для 4.5 и выше.
Пример использования.
Реализация.
Я попытался создать класс, который бы разрешил вашу проблему, используя чтение асинхронного потока, принимая во внимание ответы Марка Байерса, Роба, stevejay. Сделав это, я понял, что есть ошибка, связанная с чтением выходного потока асинхронного процесса.
Você está interessado em:
Você está no System. InvalidOperationException: StandardOut имеет не был перенаправлен или процесс еще не начался.
Затем вам нужно запустить асинхронный вывод после того, как процесс начало:
Сделав это, сделайте условие гонки, потому что выходной поток может принимать перед установкой асинхронности:
Тогда некоторые люди могли сказать, что вам просто нужно прочитать поток прежде чем вы установите его асинхронным. Но та же проблема возникает. Там будет состоянием гонки между синхронным чтением и установкой поток в асинхронный режим.
Невозможно обеспечить безопасное асинхронное чтение выходного потока процесса на самом деле "Процесс" и "ProcessStartInfo" были разработаны.
Вероятно, вам лучше использовать асинхронное чтение, как это было предложено другими пользователями для вашего дела. Но вы должны знать, что вы можете пропустить некоторую информацию из-за состояния гонки.
Я решил это так:
Я перенаправил как входные, так и выходные данные, а также обработал чтение с потоков вывода и ошибок. Это решение работает для SDK 7-8, как для Windows 7, так и для para Windows 8.
Ни один из вышеперечисленных ответов не выполняет эту работу.
Por favor, Rob Robo, um "Mark Byers" получает исключение. (Я попробовал "решения" других ответов).
Поэтому я решил предложить другое решение:
Этот код отлаживается и работает отлично.
Мне кажется, что это простой и лучший подход (нам не нужно AutoResetEvent):
У меня была такая же проблема, но причина была другая. Однако это произойдет в Windows 8, но не под Windows 7. Кажется, что эта строка вызвала эту проблему.
Решением было НЕ отключить UseShellExecute. Теперь я получил всплывающее окно Shell, которое нежелательно, но намного лучше, чем программа, ожидающая ничего особенного. Поэтому я добавил для этого следующее:
Теперь меня беспокоит только то, почему это происходит в Windows 8.
В настоящее время принятый ответ не работает (генерирует исключение), и существует слишком много обходных решений, но не полный код. Это, очевидно, тратит много времени людям, потому что это популярный вопрос.
Объединив ответ Марка Байера и Кароль Тил, я написал полный код, основанный на том, как я хочу использовать метод Process. Start.
Использование.
Я использовал его для создания диалога прогресса вокруг команд git. Вот как я его использовал:
В теории вы также можете комбинировать stdout и stderr, но я не тестировал это.
Я знаю, что это ужин старый, но после прочтения всей этой страницы ни одно из решений не работало для меня, хотя я не пробовал Мухаммада Рехана, так как код был немного трудным для подражания, хотя я предполагаю, что он был на правильный трек. Когда я говорю, что это не сработало, что это не совсем так, иногда это будет работать нормально, я думаю, что это связано с длиной вывода до отметки EOF.
В любом случае, решение, которое работало для меня, состояло в том, чтобы использовать разные потоки для чтения StandardOutput и StandardError и писать сообщения.
Надеюсь, это поможет кому-то, кто думал, что это может быть так сложно!
Другие решения (в том числе EM0) все еще зашли в тупик для моего приложения из-за внутренних тайм-аутов и использования как стандартного, так и стандартногоError для созданного приложения. Вот что сработало для меня:
Изменить: добавлена ​​инициализация StartInfo для образца кода.
Это сообщение может быть устаревшим, но я узнал основную причину, по которой он обычно зависает, из-за для redirectStandardoutput или если у вас есть redirectStandarderror.
Поскольку выходные данные или данные об ошибках велики, это вызовет время зависания, поскольку оно все еще обрабатывается на неопределенный срок.

Process. start waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até um processo terminar.
Eu tenho um aplicativo que faz.
para iniciar outro aplicativo 'ABC'. Eu quero aguardar até que o aplicativo final (processo morre) e continuar minha execução. Como eu posso fazer isso?
Pode haver várias instâncias do aplicativo 'ABC' executando ao mesmo tempo.
Eu acho que você só quer isso:
Consulte a página MSDN para o método. Também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se você não quer bloquear? Se isso não fizer o que você quer, por favor nos dê mais informações sobre seus requisitos.
Faço o seguinte na minha aplicação:
Há alguns recursos extras lá que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua UI para manter o usuário "informado" (gerenciamento de expectativa):

Processo . Método WaitForExit (Int32)
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.
Assembly: System (no System. dll)
Parâmetros.
A quantidade de tempo, em milissegundos, para aguardar o encerramento do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
é verdade se o processo associado tenha saído; caso contrário, falso.
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit (Int32) para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
WaitForExit (Int32) faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Esse método instrui o componente Processo a aguardar um período finito de tempo para o processo sair. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processar. WaitForExit (Int32) irá comportar-se da mesma forma que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
No Quadro 3.5 e versões anteriores, se o milissegundo fosse -1, a sobrecarga WaitForExit (Int32) esperava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nas aplicações Windows Forms, defina a propriedade SynchronizingObject.
Quando um processo associado é encerrado (é encerrado pelo sistema operacional através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (Int32). O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado.
Consulte o exemplo de código para a propriedade ExitCode.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Метод Process. WaitForExit ()
Опубликовано: Октябрь 2018.
Дает компоненту processo команду ожидать завершения связанного процесса в течение неограниченного времени.
Нет доступа к параметру ожидания.
Не задан Id процесса, и Manipular, из которого можно определить свойство Id, ну существует.
С этим объектом Processo никакие процессы не связаны.
Você pode ver o WaitForExit () для процесса, выполняющегося на удаленном компьютере. Вы пытаетесь вызвать метод WaitForExit () для процесса, выполняющегося на удаленном компьютере. Этот метод доступен только для процессов, запущенных на локальном компьютере.
WaitForExit () faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Este método instrui o componente T: System. Diagnostics. Process para aguardar uma quantidade infinita de tempo para que o processo e os manipuladores de eventos saem. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar M: System. Diagnostics. Process. CloseMainWindow para um processo que tenha uma interface de usuário, a solicitação ao sistema operacional para encerrar o processo associado pode não ser tratada se o processo for gravado para nunca entrar em seu loop de mensagem .
Nas versões net_v35_long e anteriores, a sobrecarga M: System. Diagnostics. Process. WaitForExit aguardava F: System. Int32.MaxValue milissegundos (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperaram que os manipuladores de eventos saíssem se o tempo total F: System. Int32.MaxValue fosse atingido.
Esta sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga M: System. Diagnostics. Process. WaitForExit (System. Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado sai (ou seja, quando é encerrado pelo sistema de operação através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou M: System. Diagnostics. Process. WaitForExit. O componente T: System. Diagnostics. Process pode acessar a informação, que inclui o P: System. Diagnostics. Process. ExitTime, usando o P: System. Diagnostics. Process. Handle para o processo encerrado.
Como o processo associado saiu, a propriedade P: System. Diagnostics. Process. Handle do componente não mais aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de alças para processos que não foram lançados pelos componentes T: System. Diagnostics. Process, portanto, ele mantém o P: System. Diagnostics. Process. ExitTime e P: System. Diagnostics. Process. Handle informações na memória até o componente T: System. Diagnostics. Process especificamente liberta os recursos. Por esse motivo, sempre que você ligar para M: System. Diagnostics. Process. Start para uma instância T: System. Diagnostics. Process, ligue para M: System. Diagnostics. Process. Close quando o processo associado terminou e você não precisa mais de nenhum informações administrativas sobre isso. M: System. Diagnostics. Process. Close libera a memória alocada para o processo encerrado.
Consulte a seção Comentários da página de referência de propriedade P: System. Diagnostics. Process. StandardError.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Метод Process. WaitForExit (Int32)
Опубликовано: Октябрь 2018.
Дает компоненту Processo команду ожидать завершения связанного процесса в течение указанного времени в миллисекундах.
Количество времени в миллисекундах для ожидания завершения связанного процесса. Максимальным является наибольшее возможное 32-битное целое число, которое представляет для операционной системы бесконечность.
Возвращаемое значение.
Значение true, если связанный процесс завершился; в противном случае - значение false.
Нет доступа к параметру ожидания.
Не задан Id процесса, и Manipular, из которого можно определить свойство Id, ну существует.
С этим объектом Processo никакие процессы не связаны.
Você está certo para WaitForExit (Int32) для процесса, запущенного на удаленном компьютере. Вы пытаетесь вызвать метод WaitForExit (Int32) для процесса, запущенного на удаленном компьютере. Этот метод доступен только для процессов, запущенных на локальном компьютере.
WaitForExit (Int32) faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Esse método instrui o componente T: System. Diagnostics. Process para aguardar uma quantidade de tempo finito para o processo sair. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (F: System. Threading. Timeout. Infinite) por milissegundos e M: System. Diagnostics. Process. WaitForExit (System. Int32) se comportará da mesma forma que o M: System. Diagnostics. Process. WaitForExit sobrecarga. Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
Nas versões net_v35_long e anterior, se milissegundos foi -1, a sobrecarga M: System. Diagnostics. Process. WaitForExit (System. Int32) esperava F: System. Int32.MaxValue milissegundos (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncronos tenha sido concluído, chame a sobrecarga M: System. Diagnostics. Process. WaitForExit que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento E: System. Diagnostics. Process. Exited seja tratado corretamente nas aplicações Windows Forms, defina a propriedade P: System. Diagnostics. Process. SynchronizingObject.
Quando um processo associado é encerrado (é encerrado pelo sistema operacional através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou de M: System. Diagnostics. Process. WaitForExit (System. Int32 ). O componente T: System. Diagnostics. Process pode acessar a informação, que inclui o P: System. Diagnostics. Process. ExitTime, usando o P: System. Diagnostics. Process. Handle para o processo encerrado.
Como o processo associado saiu, a propriedade P: System. Diagnostics. Process. Handle do componente não mais aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de alças para processos que não foram lançados pelos componentes T: System. Diagnostics. Process, portanto, ele mantém o P: System. Diagnostics. Process. ExitTime e P: System. Diagnostics. Process. Handle informações na memória até o componente T: System. Diagnostics. Process especificamente liberta os recursos. Por esse motivo, sempre que você ligar para M: System. Diagnostics. Process. Start para uma instância T: System. Diagnostics. Process, ligue para M: System. Diagnostics. Process. Close quando o processo associado terminou e você não precisa mais de nenhum informações administrativas sobre isso. M: System. Diagnostics. Process. Close libera a memória alocada para o processo encerrado.
Consulte o exemplo de código para a propriedade P: System. Diagnostics. Process. ExitCode.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

No comments:

Post a Comment