Wednesday 4 April 2018

Exceção do processo c # waitforexit


Processo C # exceção beforeforex
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit () causa uma NullReferenceException.
O código a seguir causa uma NullReferenceException.
Usando o depurador eu vejo que Process. Start está retornando nulo. Então ... qualquer pensamento sobre porque isso está acontecendo? Gostaria realmente de bloquear a execução do programa até o usuário terminar com o processo iniciado.
UPDATE: Refatorando o código para isso:
causa esta exceção:
InvalidOperationException: Nenhum processo está associado a este objeto.
Do MSDN, Process. Start retornará:
Um novo componente do Processo que está associado ao recurso de processo ou a referência nula (Nothing no Visual Basic), se nenhum recurso de processo for iniciado (por exemplo, se um processo existente for reutilizado).
No seu caso, já que você está passando um URL para Process. Start em vez de um executável, você não está realmente iniciando um novo processo. Você está passando o URL para iexplore, ou qualquer que seja o seu navegador. E então você obtém uma volta nula.
Em qualquer caso, o que significaria "bloquear a execução do programa até o usuário terminar com o processo iniciado"? Aguarde até que o usuário feche o navegador da Web? Nesse caso, você pode querer algo como:
. que funciona adequadamente para mim. Exige que você especifique o executável do navegador, no entanto.

Processo C # exceção beforeforex
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como matar um processo sem obter um "processo" saiu " exceção?
Eu uso Process. Kill () para matar um processo. Como isso:
e às vezes o processo irá sair diretamente entre as linhas, então o controle entrará dentro se Kill for render uma exceção:
Agora, o envolvimento do código em try-catch não parece ser uma boa idéia porque InvalidOperationException pode ser chamado por outros motivos.
Existe uma maneira de matar um processo sem ter uma exceção no cenário descrito?
Você poderia P / Invoke TerminateProcess passando Process. Handle. Em seguida, avalie manualmente a causa dele (GetLastError ()). Qual é aproximadamente o que Process. Kill () faz internamente.
Mas note que o TerminateProcess é assíncrono. Então, você precisaria aguardar o controle do processo para ter certeza de que ele está pronto. Usando Process. Kill () faz isso para o seu.
Atualização: Correção, Process. Kill () também é executado de forma assíncrona. Então, você precisará usar WaitForExit () para aguardar o encerramento completo - se você se importar.
Francamente, eu não incomodaria. É claro que existe sempre a possibilidade (remota?) De que alguma "arbitrária" InvalidOperationException se separe dessa linha de código, que não está relacionada ao processo que não está mais lá ou que o objeto Processo esteja em um estado inválido, mas em A realidade, eu acho que você pode simplesmente ir com a tentativa / captura em torno do Kill.
Além disso, dependendo da sua aplicação, você poderia considerar o registro desta matança de qualquer maneira, já que parece uma espécie de medida de último recurso. Nesse caso, registre o Real InvalidOperationException com ele. Se as coisas ficam estranhas, você tem, pelo menos, seus logs para verificar por que o Kill falhou.
Tendo tudo o que disse, você também pode querer considerar capturar / manipular o Win32Exception pelas mesmas razões.

Processo C # exceção beforeforex
Obter através da App Store Leia esta publicação em nosso aplicativo!
Por que Process. WaitForExit lançaria um & quot; no process & quot; exceção mesmo quando existe um processo?
Eu tenho um serviço do Windows contendo este código:
A finalidade deste código é executar um extrato IFilter em um documento, usamos um processo separado porque alguns IFilters são notoriamente escamosos.
Agora, este código corre perfeitamente bem nas caixas do Windows 7 e do Server 2008 R2, mas em um Windows Server 2003 o WaitForExit imediatamente lança uma exceção "Não há nenhum processo associado a este objeto Processo". O processo existe e completa sua tarefa sem problema.
Alguém viu isso? Alguém pode esclarecer porque o WaitForExit aumentaria esse erro?
Se eu colocar este código em um aplicativo de console e executá-lo também funciona bem na caixa do Windws Server 2003, portanto, parece ser um problema específico ao executar isso em um serviço em uma caixa do Windows Server 2003.
Ao iniciar os processos, com a classe System. Diagnostics. Process, o sistema pode usar a função CreateProcess ou ShellExecuteEx Win32. Ao usar CreateProcess, somente arquivos executáveis ​​podem ser iniciados. Ao usar o ShellExecuteEx, qualquer arquivo que possa ser iniciado usando o comando "Iniciar-> Executar" do shell.
No entanto, estas são formas completamente diferentes de iniciar processos. ShellExecuteEx envolve o shell e pode, por exemplo, reutilizar uma instância existente do Word ou do Excel para abrir um documento, usando as informações armazenadas no HKCR \ & lt; progid & gt; \ shell \ & lt; verb & gt; Chave do registro. Isso pode envolver, por exemplo, usando o DDE para procurar e ativar uma instância do Excel existente.
Consulte a documentação sobre SHELLEXECUTEINFO do ShellExecuteEx:
Observe que ShellExecuteEx pode ou não retornar um hProcess dependendo se um novo processo foi iniciado. Este é o comportamento que você está vendo.
CreateProcess é uma função de nível inferior e cria um processo diretamente, e simplesmente passa os argumentos equivalentes. Ele sempre retorna um identificador de processo.
Nota: Como você parece estar iniciando um arquivo executável, é um pouco surpreendente que nenhum hProcess seja retornado pelo ShellExecuteEx. No entanto, se você quiser garantir que você obtenha um identificador de processo, usar UseShellExecute = false é a coisa correta a fazer.

Processo C # exceção beforeforex
Criei um aplicativo de console que inicia outro Exe com a ajuda do método Process. Start (). O que eu quero fazer se no Exe 2 aumentar qualquer exceção, então deve entrar no Exe1. A seguir está o código que escrevi.
static void Main (string [] args)
string arguments = string. Empty;
foreach (string strData em args)
string. Format (& quot; & quot ;, arguments, strData);
Processo notePad = novo Processo ();
SecureString secure = new SecureString ();
foreach (char c in & quot; password & quot;)
ProcessStartInfo startInfo = novo ProcessStartInfo ();
usando (Process exeProcess = Process. Start (startInfo))
string. Format (& quot; - & quot ;, & quot; Exception raised In LaunchModelCatalogueApp: & quot ;, ex. Message), EventLogEntryType. Information);
Programa de classe estática.
static void Main (string [] args)
se qualquer aumento de exceção no Exe 2, então deve ser capturado no Exe 1. Como posso fazer isso?
Obrigado e saudações.
As exceções são uma característica inteiramente intra-processo.
O paradigma padrão é ter o executável retornar um código de retorno do seu método principal. Se retornar 0, ele terminou com sucesso, se retornar qualquer outra coisa, então houve um erro. O número específico retornado pode ser usado para denotar o tipo de erro; Se você não se preocupa em informar diferentes tipos de erros, basta retornar um.
Para fazer isso, altere o método principal para ser int Main, em vez de void Main. Envolva uma tentativa / captura em torno da totalidade do método principal. Na captura, retornar 1, no final da tentativa, retornar 0.
Você pode usar a propriedade ExitCode da classe Process para ler o valor do aplicativo de chamada.
Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Usando Process. Start para iniciar um novo processo, você não tem como capturar as exceções lançadas em outro processo. Para isso, você precisa de técnicas de Inter Process Communication (IPC). Você pode usar o remoting ou Windows Communication Foundations.
Você pode encontrar muitos artigos na rede sobre como capturar exceção em aplicativos cliente / servidor.
Espero que isso ajude você.
Marque esta postagem como resposta se resolveu seu problema. Programação Feliz!
Proposta como resposta por Sarathi R segunda-feira, 16 de janeiro de 2012 10:43 AM Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Outra abordagem simples é registrar as exceções em um arquivo de texto e lê-lo onde quiser.
Se esta postagem responder sua pergunta, clique em & quot; Marcar como resposta & quot; . Se esta postagem for útil, clique em "Marcar como Útil" .
Editado por Dummy yoyo Moderador segunda-feira, 16 de janeiro de 2012 8:21 AM Edite o link para disponibilizá-lo. Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Obrigado Servy, que eu sei sobre o ExitCode e também tenho cansado. mas o problema é que não consigo retornar a exceção exata com a ajuda do código porque não conheço a exceção levantada.
Obrigado e saudações.
Você pode usar saída padrão ou fluxo de erro padrão para enviar quantidades maiores de informações. Nesse caso, o erro padrão causaria mais sentido. (Você deve usar isso além do código de saída.) Apenas imprima a exceção ao erro padrão no bloco de captura, redirecione os fluxos de saída no programa de chamada e leia o fluxo de erro (ignorando se você receber um código de saída de 0).
Certifique-se de procurar condições de bloqueio ao ler o resultado de um processo, especialmente se estiver lendo de dois fluxos diferentes. A página MSDN no Processo explica algumas armadilhas comuns.
Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Todas as respostas.
Usando Process. Start para iniciar um novo processo, você não tem como capturar as exceções lançadas em outro processo. Para isso, você precisa de técnicas de Inter Process Communication (IPC). Você pode usar o remoting ou Windows Communication Foundations.
Você pode encontrar muitos artigos na rede sobre como capturar exceção em aplicativos cliente / servidor.
Espero que isso ajude você.
Marque esta postagem como resposta se resolveu seu problema. Programação Feliz!
Proposta como resposta por Sarathi R segunda-feira, 16 de janeiro de 2012 10:43 AM Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Sim, este é um conceito muito bom. Eu apliquei um dos meus projetos anteriores. Você precisa passar por uma exceção e você deve pegá-la em uma classe derivada de exceção. Posso dar um exemplo. você pode verificar o código do link / KB / dotnet / unhandledexceptions. aspx.
Lembre-se de clicar em & ldquo; Marcar como resposta & rdquo; na postagem que o ajuda, isso pode ser benéfico para outros membros da comunidade lendo o tópico.
Editado por KashNetDev quinta-feira, 12 de janeiro de 2012 6:26.
Obrigado Adavesh e Kash.
As exceções são uma característica inteiramente intra-processo.
O paradigma padrão é ter o executável retornar um código de retorno do seu método principal. Se retornar 0, ele terminou com sucesso, se retornar qualquer outra coisa, então houve um erro. O número específico retornado pode ser usado para denotar o tipo de erro; Se você não se preocupa em informar diferentes tipos de erros, basta retornar um.
Para fazer isso, altere o método principal para ser int Main, em vez de void Main. Envolva uma tentativa / captura em torno da totalidade do método principal. Na captura, retornar 1, no final da tentativa, retornar 0.
Você pode usar a propriedade ExitCode da classe Process para ler o valor do aplicativo de chamada.
Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Obrigado Servy, que eu sei sobre o ExitCode e também tenho cansado. mas o problema é que não consigo retornar a exceção exata com a ajuda do código porque não conheço a exceção levantada.
Obrigado e saudações.
Outra abordagem simples é registrar as exceções em um arquivo de texto e lê-lo onde quiser.
Se esta postagem responder sua pergunta, clique em & quot; Marcar como resposta & quot; . Se esta postagem for útil, clique em "Marcar como Útil" .
Editado por Dummy yoyo Moderador segunda-feira, 16 de janeiro de 2012 8:21 AM Edite o link para disponibilizá-lo. Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
Obrigado Servy, que eu sei sobre o ExitCode e também tenho cansado. mas o problema é que não consigo retornar a exceção exata com a ajuda do código porque não conheço a exceção levantada.
Obrigado e saudações.
Você pode usar saída padrão ou fluxo de erro padrão para enviar quantidades maiores de informações. Nesse caso, o erro padrão causaria mais sentido. (Você deve usar isso além do código de saída.) Apenas imprima a exceção ao erro padrão no bloco de captura, redirecione os fluxos de saída no programa de chamada e leia o fluxo de erro (ignorando se você receber um código de saída de 0).
Certifique-se de procurar condições de bloqueio ao ler o resultado de um processo, especialmente se estiver lendo de dois fluxos diferentes. A página MSDN no Processo explica algumas armadilhas comuns.
Marcado como resposta por Dummy yoyo Moderador terça-feira, 24 de janeiro de 2012 8:40 AM.
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.

Processo C # exceção beforeforex
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.

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.

No comments:

Post a Comment