Thursday 25 May 2017

Deadlock Waitforexit


Eu li sobre esta condição de impasse que estou bastante certo está afetando meu código (abaixo). O que não entendo é: este código funcionou perfeitamente funcionando no Windows Server 2003 (2.0) nos últimos 12 anos. Agora estamos tentando movê-lo para o Windows Server 2012, onde sempre está bloqueado. Enquanto minhas DLLs são criadas para anyCPU (ainda segmentando 2.0), o processo executável que está sendo executado é absolutamente de 32 bits, e a mudança do Server 2003 para o Server 2012 passa de um sistema operacional de 32 bits para 64 bits. Eu acho que entendo o que fazer para resolver o problema, mas alguém sabe por que esse comportamento teria mudado do Server 2003 para Server 2012 O bloqueio do Mistério ainda existe, mesmo depois de alterar o código acima conforme recomendado: quais outras condições poderiam causar esse impasse Se Eu deveria examinar o StandardError, revelaria algo útil FWIW, provisionamos outro Windows Server 2003 (32 bits), que executa o IIS 6. Essa foi a configuração original da máquina que este código funcionou por 12 anos (com apenas um bloqueio ocasional ). Nosso mesmo código que os deadlocks no Server 2012 IIS 8 NÃO DEADLOCK neste Server 2003. Agora temos nosso próprio código mínimo e completo que reproduz o problema. No entanto, o. exe weve licenciado que está sendo executado pelo processo tem cláusulas de confidencialidade que nos impedem de publicar. Eu percebo que não ajuda os especialistas aqui. A SUA SUGESTÃO que encontramos é que quando executado através do depurador do Visual Studio 2013 instalado no servidor real, o processo não é deadlockhang, ao invocar o processo de um navegador EXTERNO do servidor. E estranhamente - de um navegador NO SERVIDOR 2012, não podemos conectar-se a essa página de teste - o navegador apenas diz que se conecta e eventualmente expira (no entanto, outros sites hospedados pelo mesmo servidor, o mesmo IIS 8 pode ser alcançado a partir de um navegador no Servidor) Uma vez que os mesmos parâmetros de linha de comando funcionam manualmente a partir de um shell de comando de administrador ou um shell de comando não-admin funciona perfeitamente, é difícil acreditar que é um problema WOW64 de 64 bits com este executável de 32 bits ou suas DLLs necessárias. Continuamos a procurar lugares onde nossas permissões podem estar causando problemas (o processo precisa escrever em uma pasta temporária, que nós colocamos em c: temp, por enquanto). Perguntou 16 de setembro 16 às 2:05 Eu tenho algumas respostas SO diferentes que, ao responder a perguntas diferentes da que você tem aqui, inclua exemplos de redirecionamento de StandardOutput e StandardError sem bloquear o código. Você pode encontrar um ou mais deles úteis: stackoverflowa33508142. Stackoverflowa26722542. E stackoverflowa38881345 ndash Peter Duniho 5 de setembro 16 em 23: 10Elina: obrigado pela sua resposta. Existem algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a essa questão. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução mais moderna, Tarefa paralela (TPL), baseada em solução para 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar também o seu código ou talvez algo equivalente ao quotggsci. exequot do quot quotgbsci. exequot se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 em 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet 7 de novembro 14 às 18:38 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 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. Respondeu 13 de janeiro 15 às 10:35 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 bug relacionado à leitura de fluxo de saída de processo assíncrono. 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 você 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 obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process 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.

No comments:

Post a Comment