Waitforexit c # error
Obter através da App Store Leia esta publicação em nosso aplicativo!
C # Process. Start - como executar o WaitForExit.
Eu tenho um aplicativo de console que chama outros aplicativos de console.
Não consigo instanciar Processar e usar isso à medida que recebo a mensagem de erro "O executável especificado não é um aplicativo válido para esta plataforma de sistema operacional".
Posso chamar os aplicativos usando a versão estática do Processo, e.
No entanto, não posso obter o Processo para WaitForExit - um aplicativo é chamado e depois de um tempo, antes do primeiro aplicativo, o segundo é chamado - o que é um problema, pois depende do primeiro aplicativo a ser concluído.
Todas as sugestões sobre como obter a versão estática do Processo para aguardar a saída (alt. Como instanciar o Processo e poder chamar aplicativos implantados em uma configuração de clique?)
Process. Start Method (String, String) possui um valor de retorno do System. Diagnostics. Process.
Um novo processo que está associado ao recurso de processo ou nulo se nenhum recurso de processo for iniciado. Observe que um novo processo iniciado ao lado das instâncias já executadas do mesmo processo será independente dos outros. Além disso, Start pode retornar um processo não nulo com sua propriedade HasExited já definida como verdadeira. Nesse caso, o processo iniciado pode ter ativado uma instância existente por si só e depois encerrado.
Então eu verificaria se process. HasExited é verdadeiro antes de chamar WaitForExit.
Ok, depois de golpear minha cabeça contra uma parede durante a melhor parte de um dia, achei isso. Inicie um aplicativo ClickOnce off-line e aguarde Sair.
Usou a opção mutex. Fek me Microsoft, você pegou algo que costumava ser realmente simples e fez uma bunda de cavalo real fora disso.
Eu estava prestes a retirar meu chamado de exe e criar um monstro - estava me sentindo doente no pensamento.
Exemplo de uso.
Resolvi assim:
Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.
Eu tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um erro relacionado à leitura assíncrona do fluxo de saída do processo.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não começou.
Então, você deve iniciar a saída assíncrona lida após o processo ser iniciado:
Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de configurá-lo como assíncrono:
Então algumas pessoas podem dizer que você só precisa ler o fluxo antes de configurá-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono.
Não há como conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" e "ProcessStartInfo" foi projetado.
Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações devido à condição de corrida.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descarta. (Eu tentei as "soluções" das outras respostas).
Então eu decidi sugerir outra solução:
Este código é depurado e funciona perfeitamente.
Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema.
A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso:
Agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar.
Introdução.
A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, obviamente, desperdiçando muito tempo das pessoas porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi um código completo baseado em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:
Em teoria, você também pode combinar stdout e stderr, mas não testei isso.
Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou, isso não é inteiramente verdade, às vezes funcionaria bem, acho que é algo a ver com a duração da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim era usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:
Editar: inicialização adicionada de StartInfo para codificar a amostra.
Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.
o registro de walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2018.
Process. WaitForExit (Int32) bloqueia o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero ser executado.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava no Output = process. StandardOutput. ReadToEnd (); linha, porque não pode ter sucesso em ler todo o fluxo.
O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente por anos e, em seguida, pendure de repente sem nenhum motivo aparente.
você pode enfrentar um impasse se o comando que você atribui a "cmd. exe" ou o processo que você está chamando preenche a saída padrão ou erro padrão. Isso porque nosso código não pode alcançar as linhas.
Na verdade, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não ler os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado na linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote:
Process. WaitForExit ()
Se não pStart. HasExited Then.
Enquanto não pStart. HasExited ()
Se pStart. StartTime & lt; Now. AddSeconds (120) Então.
Facebook Twitter LinkedIn peritos-troca / dúvidas / 23298651 / Process-WaitForExit. html copy.
Para fazer perguntas e encontrar soluções.
Publicação destacada.
Parceiros de tecnologia: queremos sua opinião!
Nós valorizamos seus comentários.
Yeti Cooler, Amazon eGift Card e Movie eGift Card!
Se você tiver um problema semelhante, faça uma pergunta relacionada.
Cursos sugeridos.
617 membros fizeram perguntas e receberam soluções personalizadas nos últimos 7 dias.
Junte-se à comunidade de 500 mil profissionais da tecnologia e faça suas perguntas.
Gostei da sua resposta?
Junte-se à nossa comunidade para obter mais soluções ou fazer perguntas.
Waitforexit c # error
System. Diagnostics. Process SetupGUIProcess = novo System. Diagnostics. Process ();
SetupGUIProcess. StartInfo = novo System. Diagnostics. ProcessStartInfo (strStartMenuPath + & quot; \\ Programas \\ AXYZ International \\ A2MC Setup. appref-ms & quot;);
Quando o programa chega à linha WaitForExit, ele causa uma exceção "Nenhum processo está associado a este objeto". O processo começa ok. Estou tentando obter o segmento de chamada para bloquear até que o processo seja encerrado. Esse é o caminho certo?
2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne.
3. Inicie o Executeable como outro Processo (// exe) instalado recentemente.
4. WaitForProcess (); (// processo do Executeable Name).
Marcado como resposta por Bin-ze Zhao segunda-feira, 05 de outubro de 2009 8:16.
Todas as respostas.
Eu sei com certeza que o processo ainda está sendo executado no momento em que WaitForExit é chamado. Eu percebi que estou iniciando o processo por meio de uma referência clickonce. Eu tentei isso em todas as diferentes maneiras pelas quais você pode iniciar um processo e ocorre a mesma exceção. Se eu começar o processo apenas passando o caminho para iniciar (). o começo retorna nulo. Existe outra maneira de iniciar um aplicativo que é instalado por um escudo de instalação clickonce outro que por referência? Eu estaria interessado em ver se eu poderia chamar o exe diretamente. Talvez então a função WaitForExit conheça o objeto do processo. Isso é intrigante. Obrigado pela resposta.
Os aplicativos ClickOnce são lançados usando uma URL para o arquivo de manifesto de implantação (.application). Então você usa a sintaxe do parâmetro querystring da web:
Eu não tenho um servidor. Eu só quero enviar pessoas 2 instalando sheilds zipped up. Eles os instalam. e um dos programas instalados pode chamar o outro como um processo e depois bloquear e aguardar até que seja feito. Ainda não está claro para mim o que eu tenho que fazer para que eu possa chamar o programa usando a sintaxe acima. Preciso de um sever para fazer isso? Quando você diz, pare de usar o ClickOnce. Você quer dizer parar de chamá-lo por sua referência ou quer dizer parar de usá-lo e usar algum outro método de reprodução? Eu acho que realmente não entendo o que o Click Once significa. O termo Click Once simplesmente encapsula o significado de todas as blindagens de instalação por meio da opção de publicação no Visual Studio? Espero que você veja com o que estou lutando. Tem que haver algo simples aqui, estou faltando.
Eu concordo totalmente com o NoBugz (que muito provavelmente entende isso melhor do que eu). Então, vamos pensar sobre isso você e eu. Quando você visita um URL, não inicia um processo ao vivo. Você solicita ao servidor alguns dados e retorna alguns dados e, em seguida, seu fora de sua vida. Não existe um estado persistente como um processo ao qual você pode acessar. Você está tentando usar um aplicativo ClickOnce que usa um URL, então, claro, não há nenhum processo devido exatamente ao que acabei de passar. Pare de usar o ClickOnce.
Crie um aplicativo instalável como esse.
Ligue assim.
Espere por isso assim.
Não concordo que as postagens estão se desviando da sua pergunta. Seu exemplo usa ClickOnce, o único problema que sua experiência é devido ao fato de você estar usando o ClickOnce. É por isso que as pessoas dizem. "pare de usar o ClickOnce". Talvez você não entenda o que o ClickOnce é vs um executável? Este é um exemplo muito simples de exatamente o que você está tentando fazer sem um clique.
Mais uma vez obrigado pela resposta.
1. O clique é uma referência que faz referência a um exe? Gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado?
Mais uma vez obrigado pela resposta.
1. O clique é uma referência que faz referência a um exe? Gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado?
Há um problema lógico com suas perguntas.
Se você precisa instalar o pacote, você não possui o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhuma fonte = falha épica.
Desculpe, homem, não entendi. Vamos passo passo a passo.
1. Vamos assumir que você sabia onde estava o exe. Você o lançou com um processo. De acordo com o número 2, existem dependências, portanto, seu programa explode. Como você conserta isso? Você precisa instalar o programa antes de tentar executar o exe.
Suponhamos que não sei onde o exe é (porque eu não) porque não parece haver um depois de instalar o botão uma vez instalado o escudo. Se houver outra maneira de criar uma estrutura de instalação para que eu tenha acesso a uma exe. Você pode fornecer o link para a documentação que mostra como fazê-lo?
Eu tenho o arquivo de solução do programa original para o visual studio desde que eu sou o autor. Se eu criei um pacote de instalação do MSI e o descarte como um arquivo MSI, como você diz, então eu poderei chamar o exe up como processo? Onde será localizado? Você pode fornecer o link para a documentação sobre como criar o MSI se ele for instalado um exe?
Se você precisa instalar o pacote, você não possui o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhuma fonte = falha épica.
2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne.
3. Inicie o Executeable como outro Processo (// exe) instalado recentemente.
4. WaitForProcess (); (// processo do Executeable Name).
Marcado como resposta por Bin-ze Zhao segunda-feira, 05 de outubro de 2009 8:16.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn.
System. Diagnostics. Process SetupGUIProcess = novo System. Diagnostics. Process ();
SetupGUIProcess. StartInfo = novo System. Diagnostics. ProcessStartInfo (strStartMenuPath + & quot; \\ Programas \\ AXYZ International \\ A2MC Setup. appref-ms & quot;);
Quando o programa chega à linha WaitForExit, ele causa uma exceção "Nenhum processo está associado a este objeto". O processo começa ok. Estou tentando obter o segmento de chamada para bloquear até que o processo seja encerrado. Esse é o caminho certo?
2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne.
3. Inicie o Executeable como outro Processo (// exe) instalado recentemente.
4. WaitForProcess (); (// processo do Executeable Name).
Marcado como resposta por Bin-ze Zhao segunda-feira, 05 de outubro de 2009 8:16.
Todas as respostas.
Eu sei com certeza que o processo ainda está sendo executado no momento em que WaitForExit é chamado. Eu percebi que estou iniciando o processo por meio de uma referência clickonce. Eu tentei isso em todas as diferentes maneiras pelas quais você pode iniciar um processo e ocorre a mesma exceção. Se eu começar o processo apenas passando o caminho para iniciar (). o começo retorna nulo. Existe outra maneira de iniciar um aplicativo que é instalado por um escudo de instalação clickonce outro que por referência? Eu estaria interessado em ver se eu poderia chamar o exe diretamente. Talvez então a função WaitForExit conheça o objeto do processo. Isso é intrigante. Obrigado pela resposta.
Os aplicativos ClickOnce são lançados usando uma URL para o arquivo de manifesto de implantação (.application). Então você usa a sintaxe do parâmetro querystring da web:
Eu não tenho um servidor. Eu só quero enviar pessoas 2 instalando sheilds zipped up. Eles os instalam. e um dos programas instalados pode chamar o outro como um processo e depois bloquear e aguardar até que seja feito. Ainda não está claro para mim o que eu tenho que fazer para que eu possa chamar o programa usando a sintaxe acima. Preciso de um sever para fazer isso? Quando você diz, pare de usar o ClickOnce. Você quer dizer parar de chamá-lo por sua referência ou quer dizer parar de usá-lo e usar algum outro método de reprodução? Eu acho que realmente não entendo o que o Click Once significa. O termo Click Once simplesmente encapsula o significado de todas as blindagens de instalação por meio da opção de publicação no Visual Studio? Espero que você veja com o que estou lutando. Tem que haver algo simples aqui, estou faltando.
Eu concordo totalmente com o NoBugz (que muito provavelmente entende isso melhor do que eu). Então, vamos pensar sobre isso você e eu. Quando você visita um URL, não inicia um processo ao vivo. Você solicita ao servidor alguns dados e retorna alguns dados e, em seguida, seu fora de sua vida. Não existe um estado persistente como um processo ao qual você pode acessar. Você está tentando usar um aplicativo ClickOnce que usa um URL, então, claro, não há nenhum processo devido exatamente ao que acabei de passar. Pare de usar o ClickOnce.
Crie um aplicativo instalável como esse.
Ligue assim.
Espere por isso assim.
Não concordo que as postagens estão se desviando da sua pergunta. Seu exemplo usa ClickOnce, o único problema que sua experiência é devido ao fato de você estar usando o ClickOnce. É por isso que as pessoas dizem. "pare de usar o ClickOnce". Talvez você não entenda o que o ClickOnce é vs um executável? Este é um exemplo muito simples de exatamente o que você está tentando fazer sem um clique.
Mais uma vez obrigado pela resposta.
1. O clique é uma referência que faz referência a um exe? Gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado?
Mais uma vez obrigado pela resposta.
1. O clique é uma referência que faz referência a um exe? Gostaria de chamar o exe. Eu simplesmente não consigo encontrar em qualquer lugar no sistema que foi iniciado. Existe um caminho específico onde é colocado quando um clique de publicação clique em um escudo de instalação é executado?
Há um problema lógico com suas perguntas.
Se você precisa instalar o pacote, você não possui o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhuma fonte = falha épica.
Desculpe, homem, não entendi. Vamos passo passo a passo.
1. Vamos assumir que você sabia onde estava o exe. Você o lançou com um processo. De acordo com o número 2, existem dependências, portanto, seu programa explode. Como você conserta isso? Você precisa instalar o programa antes de tentar executar o exe.
Suponhamos que não sei onde o exe é (porque eu não) porque não parece haver um depois de instalar o botão uma vez instalado o escudo. Se houver outra maneira de criar uma estrutura de instalação para que eu tenha acesso a uma exe. Você pode fornecer o link para a documentação que mostra como fazê-lo?
Eu tenho o arquivo de solução do programa original para o visual studio desde que eu sou o autor. Se eu criei um pacote de instalação do MSI e o descarte como um arquivo MSI, como você diz, então eu poderei chamar o exe up como processo? Onde será localizado? Você pode fornecer o link para a documentação sobre como criar o MSI se ele for instalado um exe?
Se você precisa instalar o pacote, você não possui o código-fonte (é por isso que eu assumiria que você continuasse tentando usar um clique), então você está essencialmente morto na água com seus requisitos. Nenhuma fonte = falha épica.
2. Aguarde até que o aplicativo termine de instalar usando Process. WaitOne.
3. Inicie o Executeable como outro Processo (// exe) instalado recentemente.
4. WaitForProcess (); (// processo do Executeable Name).
Marcado como resposta por Bin-ze Zhao segunda-feira, 05 de outubro de 2009 8:16.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn.
No comments:
Post a Comment