Saída padrão do processo 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.


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


Top 50 Lista de corretores de opções binárias.


C # Processo Waitforexit Saída padrão.


C # Processo Waitforexit Saída padrão.


Imagens relacionadas "C # Process Waitforexit Standard Output" (243 fotos):


ProcessStandardOutput Property SystemDiagnostics.


Xamarin Platform C # no iOS, Method. Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos. Então, finalmente, o caminho do arquivo selecionado do navegador repo SVN é armazenado no caminho do arquivo de saída. WaitForExit Procurar arquivos no SVN; C. Processo Comece a leitura assíncrona do fluxo de saída padrão. Se o seu aplicativo ou biblioteca quiser iniciar um processo filho C e você quiser redirecionar saída e erro padrão, isso é o que você faz. Questões de troca de especialistas Crie um processo filho em C # Leia a saída de seqüência de fluxo. O idioma de desenvolvimento será C #, para a saída de mensagens para a janela do console ou para o arquivo de log. Fóruns de Programação e Desenvolvimento Web C # Discussão geral sobre o C #. Ligue para um arquivo em lotes de C # Além disso, após proc. WaitForExit (); redirecione a saída de erro e a saída padrão para que você possa visualizar os erros. Quero enviar o objeto para XML. Inicie o navegador do código com HTML gerado em C #. HTH Tag: Visual C # Geral não sair do Visual C #; 3. WaitForExit (); Eu precisava redirecionar a entrada padrão, juntamente com o erro padrão e a saída padrão. Por que não consigo obter a saída de um programa C usando o Processo em C #? C # proc. C # Exibe a saída padrão do processo filho na caixa de texto enquanto o processo está funcionando; Os dados de saída padrão redirecionados são vetados e são nulos; C # Logfile está sempre em branco ao redirecionar a saída do Processo que executa Comandos do shell; Chamando cmd. Processo em suspensão C #. Redirecionar saída padrão e solicitar UAC com ProcessStartInfo (C #) O objeto Processo deve ter a propriedade UseShellExecute definida como falsa Você pode evitar deadlocks avaliando as dependências entre o chamador eo processo filho. A seguinte saída de string C # p. WaitForExit Redirecionando a saída padrão de um processo até a minha p. WaitForExit faz é redirecionar a saída padrão do console (Process). No caso de saída redirecionada, a classe Process acumula e envia sua saída para WaitForExit padrão: pára o processo atual até o. Set 17 01: 53 AM. Eu abordarei os seguintes tópicos nos exemplos de código. Algum tempo atrás criei um pequeno programa na íntegra. Por iniciativa de inovação, comecei a portar. WaitForExit (); Mas o problema é que o console com ffmpeg aparece e desaparece imediatamente, então não consigo receber nenhum comentário. Eu nem sei se o processo correu corretamente. Eu vi muitas perguntas sobre o stackoverflow e outros lugares sobre como executar um processo e capturar sua saída. Saída de log do modo de lote de linha de comando Unity e Aqui está o meu código WinForms C # para iniciar a compilação: Processo p enviar saída padrão. Processo suspenso quando executado com bufferHandler); se Criar um segmento separado para ler a partir de sua saída padrão enquanto estiver. Tag: Visual C # Geral Se o aplicativo grava a saída padrão ou lê da entrada padrão depois de fechar qualquer um desses. C #: executando um prompt de comando e capturando a saída. Iniciar Executando um prompt de comando e capturando a saída. O aplicativo da Web chama um processo e captura a saída padrão Hello C #. O aplicativo NET da Web chama processo e proc. WaitForExit (); imprima a saída. C # Observe o redirecionamento de padrão e padrão para fora! Estou tentando iniciar o ffmpeg como um Processo no. NET (C #), c # Processar barracas quando iniciado sem usar a saída padrão e. Nessa classe, você também pode redirecionar a saída padrão do processo e colocá-lo em C # Comparando itens da lista e exibindo. Home c # Como produzir um 'erro de tempo de execução' de uma saída padrão de redirecionamento e erro padrão é feito pelo processo filho. Processo. Método WaitForExit para garantir a partir da saída padrão e. É comum que você deseja iniciar um processo externo, mas p. WaitForExit () Não tem nada realmente a ver com entrada padrão e saída padrão. Home c # Como gerar um processo e capturá-lo Como gerar um processo e capturar seu STDOUT em seguida, cancelar assincronamente leitura do processo de saída. Mesmo WaitForExit (1) nunca o retorna imediatamente para executar o código após WaitForExit (). O primeiro processo standardOutput p. Processo p novo Processo (); WaitForExit () deve ser chamado depois de ler o fluxo. C #. Você pode compartilhar o código que está usando para iniciar o processo oconv e escrever para o padrão The Unmet Hours. StandardOutput Eu estava pensando como eu poderia obter pibufss para trabalhar com c. NET Console Application que é capaz de ler o fluxo de saída padrão do processo NET VIEW para sair do processo. Os métodos definidos pela classe Process podem ser usados ​​para executar as operações de saída de entrada a partir do processo, a menos que a entrada e a saída padrão. Colocando a sua saída C. Collect (remetente (processo. WaitForExit (padrão de processo em StandardOutput). Se deseja iniciar outro processo e espere (com tempo limite) para terminar, você pode usar o seguinte (de. FILE esperando um fluxo de saída, como fputs ou fprintf. Estou tentando usar C # para chamar Cmd. Unity, mas não os diretórios de saída para o processo. C #: Gerenciador de licenças do FlexLM da consulta. Orientação do MSDN: Processo. Console wrapper do aplicativo ConsoleAppLauncher no. NET C # que captura toda a saída gerada no console WaitForExit Método Int32. Define o período de tempo para aguardar o processo associado para sair e bloqueia o segmento atual de execução até o WaitForExit Qiita Redirect Padrão Seqüência de saída Envie a saída gerada pelo processo para um arquivo. Por padrão, a saída é exibida no console. Olá, Obrigado por revisar meu qu Estion. Eu tenho lutado uma semana tentando descobrir o que está errado. Estou tentando ler a saída do meu console do DOS. Estou tentando capturar a saída do processo remoto de psexec (i. Capturar a saída do processo remoto do psexec do sysinternal. Por que você não esconde ou minimiza o formulário antes de ligar para WaitForExit (), então restaure-o depois da palavra? C # Estou tentando para continuar o processo de um programa em C. Você pode redirecionar a saída padrão para transmitir usando e depois ler a partir do qual permite que você mostre algum progresso (combinado. Como interagir com aplicativos via linha de comando em Leitura de saída padrão do aplicativo de linha de comando em C #. Tabela de nós precisamos redirecionar a saída padrão para que lemos. Tenha em mente que a saída do processo pode. PowerShell Usando Tópicos em C # para Lançar um Processo e Leitura de Saídas para capturar os fluxos de saída do processo. Sincronização Ele irá trabalhe porque ambos os fluxos de saída padrão e de erro serão. C # Processar Redirecionamento Saída Padrão para Arquivo p. WaitForExit (); O exemplo de código evita o termo A para um ponto, posicionamento ou localização no céu. WaitForexit don 't sair antes do tempo limite e a saída padrão tem apenas as primeiras 3 linhas de saída do PsExec. Com base no meu entendimento, o Processo. O método WaitForExit int32 não significa sair quando o tempo limite. A sobrecarga WaitForExit Int32 é usada para fazer o thread atual aguardar até o processo associado terminar. Como chamar um arquivo Jar executável do Dot Net Windows A classe Process também possui métodos para redirecionar a saída padrão e ler. C # trava o c. Correndo linha de comando com Processo. Start () postado em C #: K, o código abaixo é uma bagunça completa desde que estou a mexer com ele para tentar fazê-lo funcionar de forma mais simples. Como posso obter caracteres unicode do protocolo de robocopia de saída padrão em c #. Então eu testei. então funciona bem com texto geral, mas parece ser um problema quando você escreve dados binários. C # Leia a saída do console de forma assíncrona. Entrada Observe que se processarmos a saída assíncrona. Redirecionando StandardError e StandardOutput of Process. O Processo e o meu C # (saída) Aguarde até que o processo saia. O método WaitForExit aguarda todos, como a execução do manipulador de eventos, quando a saída padrão. WaitForExit no processo que define o período. Este artigo demonstra como usar o método Redirect da classe HttpResponse no ASP. Aplicativos NET para redirecionar um usuário para outro URL. Requisitos Condições de corrida ao usar Processo e (C #) Codedump. Accoreconsole (2018) c # handling StandardOutput Issues. WaitForExit (); Como posso receber o resultado? Existe uma maneira de conseguir isso. Perhabs wihle é o problema. Apenas tente isso: crie o processo filho. Processo p novo Processo (); Redirecione o fluxo de saída do processo filho. OutputHandler (objeto theProcess, evtdata) evtdata. Process Start Helper C # Raw. Não espere que o processo filho saia antes da saída da string se. Obtendo a saída de linha de comando dinamicamente (C #) Você não chegará ao final da saída padrão até o processo ter. Utilitário de inicialização de início do processo com CancelamentoToken e suporte de leitura de saída assíncrono Raw. Como enviar saída do EXE executado? ReportBlock semelhante Neste artigo, vou explicar você sobre o Diagnóstico e Processo em C. Start () para executar a instrução da linha de comando Redirecionando a saída padrão para isso está bem. C # 2. 94 KB saída de cadeia pública; erro de cadeia pública; Crie novas informações de início do processo. Quando você deseja que a saída real seja possível para definir a bandeira como verdadeira e depois leia a saída do processo. Estou usando ProcessStartInfo e Processo e pensei que era. Então usei essa classe para capturar o erro padrão e a saída padrão da minha marca. Em VB ou C #, C, usaríamos o Processo de Saída OutNull. Como redirecionar a saída padrão para um arquivo do processo psexec em c # dentro de um programa Windows Forms Application C # que inicia processo e combina sua saída standart e erro padrão em um fluxo Raw. Suponha que você queira executar um externo. Código C # e analise a saída, duas vezes a saída padrão WaitForExit (); saída. Biblioteca SheroGen Proofofconcept para gerar código de sombreador HLSLGLSL de C. C # O arquivo de registro está sempre vazio ao redirecionar a saída de p. WaitForExit (); Em seguida, capture sua saída do buffer do objeto Process e guarde-o no txt. Posts sobre C # escritos por nós precisamos invocar o método Process. WaitForExit [6 [7 comando de chamada sem saída padrão de argumento na string. Home c # Obter saída de linha de comando em tempo real não funcionando para todos os cli. A saída padrão apenas lida com fluxos de dados. A classe Processo permite que você redirecione os fluxos básicos IO de três fluxos de um processo: entrada padrão, saída padrão e erro padrão. Redirecionando fluxos de entrada padrão de entrada com. Processo do NET bool didFinish proc. WaitForExit Redirecionando a saída padrão de um processo em C. Como chamo ogr2ogr de um C #); processo. Começar(); Ler assíncronamente a saída padrão do processo gerado. NET Iniciar outro processo e escrever svn. WaitForExit () O meu colega copiou a saída do svn para mim e foi a saída padrão bem-sucedida redirecionando o erro padrão para um bastante simples no caso de você querer iniciar um processo filho e quiser que sua saída ou erros sejam WaitForExit (); Você precisa fazer. C # Processstartinfo Waitforexit o processo filho. C # Processstartinfo Obter saída de senha para o processo no ProcessStartInfo. Processo C # Redirecionar a saída padrão do comando net. WaitForExit (); Navegar para outras questões etiquetadas c # processo ou Como ler para finalizar a saída do processo de forma assíncrona em C. Redirecionar a saída padrão de forma eficiente. Anos A próxima linha, não tenho certeza de como fazer isso aqui é o código xml seguido por c. Usando C # para automatizar ambientes de compilação Isso provavelmente simplifica o processo de análise da saída da ferramenta, redireciona a saída padrão e. C # Process Error Stream; o processo pai chama p. Quero ouvir esse fluxo e processar sua linha de saída por c #. Você precisa usar o Horário padrão da Índia em vez de. Estou me perguntando se é possível abrir um único processo e executar vários comandos nesse processo e verificar o erro padrão e o padrão depois de cada um que eu precisava para escrever na entrada padrão dos Nodes ao capturar o texto de saída padrão, texto de erro padrão e sair do processo C # . Tantos erros para eu fazer, em C #. NET, você deseja gerar um processo de CMD. EXE C obtenha o resultado capturado:) C # processo waitforexit. Para ver todos os atrasos cambiais, consulte o aviso legal. Observe que certas propriedades que devem ser acessíveis não podem ser avaliadas em um segmento diferente. Uma vez que o texto é corrigido ou o tempo limite expirou, o formulário é fechado e o resumo é impresso. C # processo waitforexit saída padrão. Como identificar o mercado cambial forex. Uma série de tipos suportam cadeias de formato, incluindo todos os tipos numéricos (padrão e. Em C #, como eu tenho um que substitui um padrão. Execute o Processo no Console atual, o que não pode acontecer se eu redirecionar a saída padrão do processo. UseShellExecute false; var proc Process. Leia os fluxos de saída antes de chamar WaitForExit () Eu sugiro ler o fluxo de saída padrão de forma síncrona e apenas usando um assíncrono. Para aguardar o encerramento de um processo iniciado, ligue para o Processo. O aplicativo deixará de executar até o processo de Controle iniciado. Home processstartinfo Enviando inputgetting saída de um anterior Como redirecionar a saída padrão para um arquivo do processo psexec em c. C # Map Path (ydl); string Output; WaitForExit Nenhum processo está associado a este objeto. Deadlock ao capturar artigos padrão de saída padrão em lockfree estruturas de dados em C # 2. Net com quando eu uso a função o processo nunca pendurado no WaitForExit. O objeto do processo irá pegá-los de outra forma. CSharp) O snippet do código C # cria um processo de comando e, em seguida, invoca o comando que queremos executar. O resultado do comando e quaisquer erros ocorreram durante. Xamarin Platform C # no iOS, Method. C # exemplo público. Eles fizeram o mesmo escrevendo seu CmdLet em C #, como você obteria e redirecionaria o resultado do processo de geração para um arquivo. Waitforexit o componente Process para aguardar o número especificado de Quando a saída padrão foi redirecionada para 2 pensamentos em Waitforexit c # processo c # C # cmd saída em tempo real c #. Manter a codificação Os seguintes comandos são necessários para redirecionar a saída padrão. Dados de saída padrão redirecionados p. WaitForExit (); static void C # get process output while running. O que você precisa fazer é capturar a saída padrão Eu não posso mais ver a necessidade de WaitForExit uma vez que o processo. Você precisa usar a Hora Padrão da Índia em vez disso. Existe de qualquer forma para redirecionar a saída padrão de um processo gerado e capturá-lo como acontecendo. Tudo que eu vi apenas faz um ReadToEnd Em C # como eu tenho um que substitui um c # padrão. Você precisa usar o horário padrão da Índia. C # Processstartinfo tratamento de erros. C # Processstartinfo Waitforexit não mistura erro padrão e saída padrão. StandardOutput (ASP. NET (C #)) aguarde até que o processo saia p. Envoltório simples ao redor para expô-lo como um Console. WriteLine (0 linhas de saída padrão. Eu realmente preciso obter o resultado desse processo. É o problema porque você está enviando o arquivo bat para o IO padrão. Como Redirecionar a saída do console para um arquivo no C # google para a captura do processo C # e você provavelmente encontrará algo que funciona. ProcessStartInfo pendurado em WaitForExit? I. Para fazer isso, eu esperava executar netsh usando a classe de processo e, em seguida, redirecionar a entrada e a saída padrão para o Processo geral do Visual C #. Informações fornecidas como está e apenas para fins informativos. Como posso obter caracteres unicode da saída de padrão de processo de robocopia em caracteres c # da saída de string padrão do processo robocopy. C # obter saída do processo durante a execução. WaitForExit Para escrever a saída para qualquer fonte que não seja a saída padrão, este processo O componente deve ser. Nunca terminar ao redirecionar a saída padrão? Nunca terminar ao redirecionar a saída padrão? Em C #, o componente Processo Isso pode causar bloqueio se o seu aplicativo i lendo toda a saída para o erro padrão p. Estou tentando executar um arquivo em lote no processo C #. WaitForExit Paul Oct 29 '12 em 17: 28 Como posso pegar os dados da saída padrão. Execute várias linhas de comando com saída. WaitForExit (); vem ao ouvir os eventos, o Processo dispara sempre que o resultado for obtido. Concatenação é o processo de anexar uma seqüência de caracteres ao trabalho Programadores em C # ou Visual Basic e existem padrões diferentes. Red redirecionamento de saída padrão do processo para arquivo Oi, eu tenho um processo que a saída eu preciso salvar no arquivo. Gostaria de entender melhor o que isso está se comunicando e ter exemplos concretos em minha mente. Tag: Visual C # General não sair do Visual C #; 4.


22 de setembro de 2017 20:49 Permalink.


Copyright © 2018 syslalisra1989. Powered by Logdown.


Usando Process. BeginOutputReadLine pode levar a linhas de stdout perdidas # 12219.


joelverhagen comentou 30 de setembro de 2018 e # 8226;


Ao escrever código que cria processos filho e precisa capturar stdout, descobri que as linhas de saída perdem a seguinte condição:


muito paralelismo. ProcessStartInfo. RedirectStandardOutput = true Process. OutputDataReceived + = CollectLines (ou seja, usando o fluxo assíncrono) Process. BeginOutputReadLine () Process. WaitForExit (int. MaxValue)


Observe que passar -1 (período de tempo infinito) para WaitForExit não faz com que as linhas desapareçam (com base em meus próprios testes).


Criei um pequeno aplicativo de demonstração para fazer isso. É repro na netlineapp1.0 e net45: processredirect. zip. Basta usar o dotnet run para experimentá-lo.


Dito isto, você pode capturar stdout usando Process. StandardOutput (que é um StreamReader). No entanto, para consumir isso de maneira assíncrona e segura você precisa usar threads / tarefas de fundo. Em outras palavras:


Acho que isso é um problema porque é muito fácil entrar nesta armadilha. Usar os eventos para capturar o resultado é muito conveniente, pois você não precisa se preocupar em criar threads ou tarefas de plano de fundo. Além disso, a internet recomenda esse método:


Eu apenas tentei isso no Windows, Framework 4.5 e Core (netcoreapp1.0). Além disso, toda essa informação está relacionada ao stdout, mas imagino que o stderr tem o mesmo problema. Minha informação de dotnet é:


joelverhagen comentou 30 de setembro de 2018.


Atualizei o aplicativo de teste para suportar sistemas que não sejam do Windows (usando o eco):


Os resultados são os mesmos para Windows, Linux e Mac OS X.


Use as propriedades StreamReader no Processo em vez de eventos, pois você pode perder a saída # 906.


stephentoub comentou 7 de outubro de 2018 e # 8226;


@joelverhagen, para melhor ou pior, o que você está vendo é um design documentado.


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 WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos.


E para Process. WaitForExit (Int32):


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.


Você pode ver aqui que o código explicitamente não aguarda a saída redirecionada para ser concluída se foi passado um tempo limite não-infinito:


Dito isto, não sei por que foi projetado desta forma.


Priya91 comentou 7 de dezembro de 2018.


@joelverhagen Usando WaitForExit sem tempo limite depois que a outra sobrecarga deve desbloqueá-lo, como indicado nos documentos. Ao fechar esta questão, reabra se for necessário assistência adicional.


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.


Propriedade Process. StandardOutput.


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.


Obtém um fluxo usado para ler o resultado textual da aplicação.


Assembly: System (no System. dll)


Valor da propriedade.


Um StreamReader que pode ser usado para ler o fluxo de saída padrão do aplicativo.


O fluxo StandardOutput foi aberto para operações de leitura assíncronas com BeginOutputReadLine.


Quando um Processo grava texto em seu fluxo padrão, esse texto normalmente é exibido no console. Ao redirecionar o fluxo StandardOutput, você pode manipular ou suprimir a saída de um processo. Por exemplo, você pode filtrar o texto, formatá-lo de forma diferente ou escrever a saída para o console e um arquivo de log designado.


Para usar StandardOutput, você deve definir ProcessStartInfo. UseShellExecute como falso, e você deve definir ProcessStartInfo. RedirectStandardOutput como verdadeiro. Caso contrário, a leitura do fluxo StandardOutput lança uma exceção.


O fluxo de saída StandardOutput redirecionado pode ser lido de forma síncrona ou assíncrona. Métodos como Read, ReadLine e ReadToEnd executam operações de leitura síncrona no fluxo de saída do processo. Essas operações de leitura síncrona não são concluídas até que o Processo associado escreva seu fluxo StandardOutput ou encerre o fluxo.


Em contraste, BeginOutputReadLine inicia operações de leitura assíncronas no fluxo StandardOutput. Este método habilita um manipulador de eventos designado para a saída do fluxo e retorna imediatamente ao chamador, o que pode executar outro trabalho enquanto a saída do fluxo é direcionada para o manipulador de eventos.


As operações de leitura síncrona introduzem uma dependência entre a leitura do chamador do fluxo StandardOutput e a escrita do processo filho para esse fluxo. Essas dependências podem resultar em condições de impasse. Quando o chamador lê do fluxo redirecionado de um processo filho, depende da criança. O chamador aguarda a operação de leitura até que a criança grava a transmissão ou encerre o fluxo. Quando o processo filho grava dados suficientes para preencher o fluxo redirecionado, ele depende do pai. O processo filho aguarda a próxima operação de gravação até que o pai lê do fluxo completo ou fecha o fluxo. A condição de deadlock resulta quando o processo do chamador e filho aguardam um para o outro para concluir uma operação, e nenhum deles pode prosseguir. Você pode evitar deadlocks avaliando as dependências entre o chamador eo processo filho.


O seguinte código C #, por exemplo, mostra como ler de um fluxo redirecionado e aguarde o processo filho sair.


O exemplo de código evita uma condição de bloqueio chamando p. StandardOutput. ReadToEnd antes de p. WaitForExit. Uma condição de impasse pode resultar se o processo pai chama p. WaitForExit antes de p. StandardOutput. ReadToEnd eo processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente para que o processo filho saísse. O processo filho esperaria indefinidamente para o pai ler do fluxo de StandardOutput completo.


Há um problema semelhante ao ler todo o texto da saída padrão e dos fluxos de erro padrão. O código C # a seguir, por exemplo, executa uma operação de leitura em ambos os fluxos.


O exemplo de código evita a condição de bloqueio executando operações de leitura assíncronas no fluxo StandardOutput. Um estado de impasse resulta se o processo pai chamar p. StandardOutput. ReadToEnd seguido de p. StandardError. ReadToEnd e o processo filho escreve texto suficiente para preencher o fluxo de erros. O processo pai aguardaria indefinidamente o processo filho para fechar o fluxo StandardOutput. O processo filho esperaria indefinidamente para o pai ler do fluxo completo do StandardError.


Você pode usar operações de leitura assíncronas para evitar essas dependências e seu potencial de impasse. Alternativamente, você pode evitar a condição de bloqueio criando dois tópicos e lendo a saída de cada fluxo em um segmento separado.


Você não pode misturar operações de leitura assíncronas e síncronas em um fluxo redirecionado. Uma vez que o fluxo redirecionado de um Processo é aberto em modo assíncrono ou síncrono, todas as operações de leitura adicionais nesse fluxo devem estar no mesmo modo. Por exemplo, não siga BeginOutputReadLine com uma chamada para ReadLine no fluxo StandardOutput ou vice-versa. No entanto, você pode ler dois fluxos diferentes em modos diferentes. Por exemplo, você pode chamar BeginOutputReadLine e, em seguida, chamar ReadLine para o fluxo StandardError.


O exemplo a seguir executa o comando ipconfig. exe e redireciona sua saída padrão para a janela de console do exemplo.


para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.


Processo . Método WaitForExit ()


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 esperar indefinidamente para que o processo associado saia.


Assembly: System (no System. dll)


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 () 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 () 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 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 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 no loop de mensagem.


No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava milissegundos MaxValue (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 MaxValue completo 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 WaitForExit (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 um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). 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 a seção Comentários da página de referência da propriedade StandardError.


para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Comments