суббота, 19 мая 2018 г.

Waitforexit c # trava


O código de Kevin me permite obter saída. Um dos meus arquivos em lote ainda está pendurado.
"C: \ EnterpriseDB \ Postgres \ 8.3 \ bin \ pg_dump. exe" - i - h localhost-p 5432-U postgres - F p - a - D - v - f "c: \ backupcasecocher \ backupdateevent2008.sql" - t "\" public \ ". \" dateevent \ "" "DbTest"
O outro arquivo em lote é:
"C: \ EnterpriseDB \ Postgres \ 8.3 \ bin \ vacuumdb. exe" - U postgres-d DbTest.
Eu verifiquei o caminho e o caminho postgresql está bem. O diretório de saída existe e ainda funciona fora do serviço. Alguma ideia?
Em vez do caminho do arquivo em lote, eu escrevi o "C: \ EnterpriseDB \ Postgres \ 8.3 \ bin \ pg_dump. exe" para o proc. StartInfo. FileName e adicionei todos os parâmetros para proc. StartInfo. Arguments. Os resultados são inalterados, mas vejo o pg_dump. exe na janela do processo. Mais uma vez isso só acontece dentro do serviço.
Eu executei o serviço com um usuário no grupo de administradores, sem sucesso. Eu restaurei null para o nome de usuário e senha do serviço.
Eu criei um serviço simples para gravar um rastreamento no log de eventos e executar um arquivo em lotes que contém "dir" nele. Agora ele será interrompido em proc. Start (); - Eu tentei mudar a conta de LocalSystem para User e eu configurei o administrador e senha, ainda nada.
Aqui está o que eu uso para executar arquivos em lote:
Eu não sei se isso vai fazer o truque para você, mas eu não tenho o problema de pendurar.
O que o arquivo em lote faz? Você tem certeza de que o processo está sendo iniciado com privs suficientes para executar o arquivo em lotes? Os serviços podem ser limitados no que lhes é permitido fazer.
Também verifique se você está fazendo algo como usar o comando copy para sobrescrever um arquivo que você faz algo como:
Além disso, verifique se você está usando caminhos completos para os comandos em lote, etc. Se o arquivo em lotes estiver iniciando um aplicativo GUI em algum tipo de modo "Console", isso pode ser um problema também. Lembre-se, os serviços não têm um "Desktop" (a menos que você ative o "interagir com o desktop") para desenhar qualquer tipo de janelas ou caixas de mensagem. Em seu programa, você pode querer abrir os canais stdout e stderr e ler a partir deles durante a execução, caso esteja recebendo alguma mensagem de erro ou algo do tipo.
WebServices provavelmente estão executando como a conta IUSR, ou a conta anônima, que sempre, de modo que pode ser um problema para você. Se funciona quando você o executa no console, esse é apenas o primeiro passo. :)
Não me lembro se System. Diagnostics. estão disponíveis apenas em depuração ou não. Provavelmente não, mas alguns deles podem ser. Vou ter que verificar isso para você.
Espero que isso te dê algumas ideias.
O pg_dump. exe provavelmente está solicitando a entrada do usuário. Este banco de dados requer autenticação? Você está confiando em alguma variável do MEIO AMBIENTE que não esteja presente para o serviço? Eu não sei pg_dump, mas quais são os outros possíveis motivos para solicitar uma entrada?
O próximo passo que eu tomaria é iniciar o depurador, e ver se você pode dizer o que o programa está esperando. Se você é expierenciado na depuração na montagem, você pode obter uma idéia do que está acontecendo usando ferramentas como ProcExp, FileMon, etc.
Ser um serviço do Windows, e não um serviço da Web, faz um pouco de diferença. De qualquer forma, você já tentou a minha sugestão de definir o "Permitir que o serviço interaja com a área de trabalho"?

o log de Walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2011.
Process. WaitForExit (Int32) trava o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero executar.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pinga o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo stdout e, portanto, o código trava no Output = process. StandardOutput. ReadToEnd (); linha porque não pode ter sucesso lendo todo o fluxo.
O mesmo acontece também se um comando em um arquivo de lote for interrompido por algum motivo e, portanto, o código acima poderia funcionar continuamente por anos e, em seguida, travar repentinamente sem nenhum motivo aparente.
Você pode experimentar um deadlock se o comando que você anexar a "cmd. exe" ou o processo que você está chamando preencher a saída padrão ou o 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 qualquer outro processo que você esteja executando) não pode continuar se 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 irá esperar eternamente para o projeto filho sair.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lotes:

Waitforexit c # trava
Eu tenho o seguinte código no meu aplicativo:
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
Uma vez que eu chamo isso através de outro aplicativo, o processo está pendente.
Então eu dei um tempo de 5 segundos e agora funciona bem. Mas preciso encontrar uma maneira melhor de corrigir esse problema, pois esse valor de tempo limite pode depender dos recursos do sistema e da quantidade de aplicativo de entrada que precisa ser processada.
Então, minha pergunta é se estamos criando um processo usando System. Diagnostics, o SO cria um thread separado e o torna como thread principal ou thread de interface do usuário?
Ou está criando um thread CLR que é o mesmo que System. Threading. Thread?
Se usarmos o pool de segmentos para criar um segmento de trabalho, essa seria uma opção melhor?

Waitforexit c # trava
Eu olhei em tópicos diferentes sobre isso, mas todos eles usam o Process. RedirectStandardOutput = True, que eu não faço.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para fazê-lo compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E o código dele está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã.
Por favor, marque como resposta se eu resolvi seu problema. :)
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Todas as respostas.
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Você tentou o mesmo comando manualmente em uma janela do console? Talvez pare e espere por algo. Ou não defina CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 3 de janeiro de 2015 16:27.
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Isso realmente fez isso. Eu tinha esquecido que espaços em branco faz com que seja um novo argumento, bobagem comigo. Eu não uso argumentos de processo com frequência. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã.
Por favor, marque como resposta se eu resolvi seu problema. :)

Waitforexit c # trava
Eu olhei em tópicos diferentes sobre isso, mas todos eles usam o Process. RedirectStandardOutput = True, que eu não faço.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para fazê-lo compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E o código dele está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã.
Por favor, marque como resposta se eu resolvi seu problema. :)
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Todas as respostas.
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Você tentou o mesmo comando manualmente em uma janela do console? Talvez pare e espere por algo. Ou não defina CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 3 de janeiro de 2015 16:27.
Você já comparou os FileNames e Arguments dos que funcionam e os que não funcionam? Existe alguma diferença neles, como os que trabalham não contêm espaços em branco no nome do arquivo ou argumentos e aqueles que trabalham não contêm espaços em branco neles? Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments.
Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você disser que não pode ser feito, então eu vou tentar.
Isso realmente fez isso. Eu tinha esquecido que espaços em branco faz com que seja um novo argumento, bobagem comigo. Eu não uso argumentos de processo com frequência. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã.
Por favor, marque como resposta se eu resolvi seu problema. :)

Комментариев нет:

Отправить комментарий