Skip to main content

Waitforexit hang seng


O código parece quase isso: como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que quero ser executado. Eu redireciono StandardError e StandarOutput para lê-los a partir do código. O código lê-los antes do processo. WaitForExit (Timeout) chamada conforme recomendado pela Microsoft (mais sobre isso mais tarde). O problema surge se o comando que envie para cmd. exe nunca termina ou trava indefinidamente. 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 junto com o comando ping - t nunca sai e nunca fecha o fluxo stdout e, portanto, o nosso código trava na linha OutputStandardOutput. ReadToEnd () porque não conseguiu 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 durante anos e, em seguida, é suspenso repentinamente sem nenhum motivo aparente. Antes de eu escrever, recomendava ler fluxos redirecionados antes do processo. WaitForExit (Timeout), bem, isso é especialmente verdadeiro se você usar a assinatura WaitForExit sem o tempo limite. Se você chamar processo. WaitForExit () antes de ler os fluxos redirecionados: código 2: você pode enfrentar um impasse se o comando que você anexar ao cmd. exe ou o processo que você está chamando preenche o padrão de saída ou erro padrão. Isso porque nosso código não pode atingir as linhas de processo de saída. StandardOutput. ReadToEnd () De fato, 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 lê os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado em A 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: o primeiro script grava 4096 bytes para a saída padrão e o segundo para o erro padrão. Salve um destes em C: testbuffsize. bat e execute nosso processo de chamada de programa. WaitForExit () antes do processo de saída. StandardOutput. ReadToEnd () como no código 2. Você pode fazê-lo escrevendo CommandResult Resultado ExecuteShellCommandSync (c: testbuffsize. bat, 1000) na linha 13 do código 1. O código não vai pendurar, mas se você escrever um byte mais em qualquer um dos dois fluxos, ele irá transbordar o tamanho do buffer tornando o programa aguentar. Se você precisa redirecionar e ler a saída padrão ou o erro padrão, a melhor solução é lê-los de forma assíncrona. Uma excelente maneira de fazer isso é proposta por Mark Byers neste segmento do stackoverflow. Como a última coisa, observe que, se o processo filho sair apenas porque você usa o processo. WaitForExit (Timeout) assinatura e ele realmente vai no tempo limite, você deve matar o processo cmd. exe e seus possíveis children. Elina: obrigado pela sua resposta. Há 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 esse problema. 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 o seu código também Ou talvez algo equivalente a quotggsci. exequot do quot do comando quotecho se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 at 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 Nov 7 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 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. Respondeu 13 de janeiro 15 às 10:35 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 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 depois que o processo for 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ê Configure-o para 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.

Comments

Popular posts from this blog

How to get moving average price in sap

Preço médio móvel O preço médio móvel (MAP) é um procedimento de avaliação em que o preço de estoque pode mudar em função de determinadas transações comerciais (recebimento de mercadorias, compensação GRIR com materiais adquiridos externamente e limpeza WIP com materiais fabricados internamente). Pré-requisitos Você especificou para cada material que seu preço de estoque pode mudar como um preço médio móvel. Com o procedimento de avaliação do MAP, os valores externos das transações comerciais são atribuídos aos objetos de inventário. A quantidade e o valor do recibo de inventário são adicionados ao inventário existente. Em seguida, um novo MAP é calculado com base na relação entre a nova quantidade de inventário e o valor do inventário. As receitas de inventário, portanto, afetam o preço. As diferenças de liquidação são atribuídas ao inventário. Isso depende da cobertura das ações. Os pagamentos apenas alteram o valor do inventário, nunca a quantidade de inventário. Os assentamentos, p...

Estratégia forex adx

FOREX Estratégias Estratégia Forex, Estratégia simples, Estratégia Forex Trading, Forex Scalping Estratégia Forex ADX Magic 8212 outra estratégia forex indicador com os testes feitos com o mesmo nome conselheiro para negociação MT4 sob suas regras, esta estratégia forex foi enviada ao comerciante, quem fez Não quer que eu chame seu nome, e melhorou o programador para resultados mais estáveis ​​e se baseia, ela indica forex 4 indicadores de divisas: ADX, um indicador de média móvel simples e Heiken Ashi, IBSRSICCIv3, o par de moedas EURUSD (H1). Em primeiro lugar, estabeleça o gráfico de pares de moedas EURUSD (H1) os seguintes indicadores de divisas: 1) Uma média móvel simples SMA (75). Aplicado para abrir 2) Indicador Médico Índice de Movimento Direccional 8212 ADX (9). Também se aplica para abrir 3) Indicador Heiken Ashi 4) Indicador IBSRSICCIv3 (a configuração do indicador forex será instalada automaticamente quando você instalar o modelo MT4, você pode baixar no final da estratégia...

Bebas finansial dengan forex news

Trading Demo Grátis Pendaftaran Akun Demo sementara tidak dapat dilakukan dikarenakan sedang ada perbaikan rutin. Kredensial akun demo Anda akan diemailkan setelah jadwal perbaikan rutina selesai. Akun Demo: Meskipun akun demo merupakan replika mercado real, beroperasi di lingkungan pasar simulasi. Dengan demikian, ada perbedaan penting yang membedakan akun demo dari akun real termasuk namun tidak terbatas pada, kurangnya ketergantungan pada likuiditas passando secara em tempo real dan ketersediaan beberapa produk yang mungkin tidak diperdagangkan pada akun real. Kemampuan operasional ketika menjalankan perintah di lingkungan demo dapat mengakibatkan transaksi dipercepat kurangnyatidak ada ordem yang ditolak dan tau tidak adanya slippage secara tipikal. Terdapat kemungkinan dimana persyaratan margem berbeda dari akun real sebagaimana atualização untuk akun demo mungkin tidak selalu bertepatan dengan akun real. Jenis eksekusi Akun Standard ditetapkan dengan Escritório de negociação seda...