Tuesday, 14 August 2018

Waitforexit process improvement


Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz pesquisa em vez de usar o evento (quando eles estão disponíveis), então você está usando CPU sem razão e que indicam que você é um programador ruim. Sua solução é realmente ruim quando comparado com o outro usando AutoResetEvent. (Mas eu não te dei -1 porque você tentou ajudar). Ndash Eric Ouellet Nov 7 14 at 18:38 Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, 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. Eu agora recebi uma janela popup Shell, que é indesejável, mas muito melhor do que o programa esperando nada particular acontecer. Então eu adicionei o seguinte work-around para que: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. Respondeu Jan 13 15 at 10:35 Usage Exemplo ImplementaçãoAdicione uma API para executar um programa de console e capturar sua saída de uma maneira simples 3483 Claramente, podemos usar a classe Process para executar um programa, redirecionar sua saída e capturar a saída. Mas fazê-lo corretamente é incompreensivelmente complicado: Você precisa ler StdOut e StdErr. Falha ao fazê-lo pode resultar em trava. Eventos de saída podem chegar depois WaitForExit retornou. (Atualização: Esta preocupação não existe.) Os eventos de saída sinalizam sua conclusão enviando uma string nula no final. MyProcess. StandardOutput. ReadAsync lança uma exceção para a última leitura com uma mensagem confusa (stackoverflow / questions / 32800802 / incapaz de ler-output-from-child-process-from-c-sharp-app-using-async-methods32800802 ). A leitura de saída binária requer contortions (myProcess. StandardOutput. BaseStream) onde não está claro se isso é suportado. Estamos alcançando a propriedade BaseStream que pode expor um objeto interno não destinado ao consumo. Falha ao ler rapidamente os fluxos redirecionados barra o processo filho. Muitos mais nesta lista: csharptest. net/321/how-to-use-systemdiagnosticsprocess-correctly/ Provavelmente, ainda mais que estão na lista de nobodies. Esta API é terrível Por favor, forneça uma maneira fácil e confiável de capturar a saída. Heres um strawman para uma API simples Agora, isto é claramente insuficiente e projetar provavelmente não agradável da API mas você começa o ponto. Os seguintes objetivos devem ser alcançados: Pouco potencial para erros. Saída de fluxo contínuo para tamanho de saída ilimitado. Texto e saída binária. Diferenciar entre StdOut e StdErr. Por exemplo, retornando um IEnumerable de um DTO como struct ConsoleOutput. O fluxo de saída deve terminar exatamente no mesmo ponto em que WaitForExit termina em. Atrasar tanto para completar apenas quando o outro também foi concluída. A API deve permitir a leitura de forma não lineal. Uma versão simplificada que captura apenas toda a saída em ambos os canais em uma seqüência. Este é provavelmente o que a maioria dos consumidores quer de qualquer maneira. Não abri este problema para obter um bug específico corrigido. Minha observação é que a API de redirecionamento de saída do processo é difícil de usar em geral. Eu tenho lutado com ele, para que outros (google / webhpcomplete1amphlenampgwsrdsslcomplete1amphlenampqsite: stackoverflow. netProcessredirect 32.000 resultados). Minha principal sugestão é criar uma API mais fácil para este caso comum. Eu não estou preocupado com qualquer problema em particular. Eu acho que é apropriado para fechar o problema se a equipe decide que não irá prosseguir esta melhoria API mais. Isso foi decidido Até agora, resolvemos uma das aproximadamente 8 preocupações (número 2). Que você levantou com a leitura de fluxos de sincronização Eu não tenho nenhuma preocupação com a leitura de todos os fluxos de sincronização. Eu nunca fiz isso e não vi outros fazê-lo. Toda a lista de preocupações realmente não é sobre essa coisa de evento particular e não tem nada a ver com fluxos de sincronização. Minha observação é que a API de redirecionamento de saída de processo é difícil de usar em geral. Concordo totalmente com você que as APIs de sincronização podem ser difíceis de usar. No entanto, você mencionou dois problemas no que diz respeito a eventos ouput saída eventos podem chegar após WaitForExit retornou. (Atualização: Esta preocupação não existe.) Qual é um não-problema. Os eventos de saída sinalizam sua conclusão enviando uma string nula no final. Isto foi adicionado principalmente para EOF e eu realmente não olhar para ele como um bug. Se você souber de quaisquer outros problemas com eventos de saída, gostaria de saber sobre eles. Eu gosto da sua sugestão sobre WaitForExitAsync. Eu não acho que podemos adicioná-lo para a classe atual Processo agora, no entanto, vou definitivamente mantê-lo em mente para o futuro. Quanto ao resto das APIs que você mencionou, eu não acho que podemos adicioná-los ao projeto de processo atual por dois motivos Processo o / p eventos parecem resolver a maioria dos problemas que você levantou. Polui o projeto atual. Nós já temos duas maneiras de ler fluxos, que não podemos remover e adicionando o terceiro complica o design ainda mais. No entanto, vou certamente manter suas sugestões em mente, no caso de qualquer oportunidade surge para atualizar isso no futuro. Eu tenho um aplicativo (aplicativo de desktop C) que é lançado a partir de outra aplicação c. Para passar o valor do aplicativo pai para o aplicativo filho estamos usando um arquivo de texto. O aplicativo pai antes de iniciá-lo, grava os valores em um arquivo de texto eo aplicativo filho lê-lo. O aplicativo filho processa o valor e calcula um resultado. Problema: uma vez que o usuário fecha o aplicativo filho, o aplicativo pai precisa ser notificado de que o outro processo está próximo para que o aplicativo pai possa ler o valor de outro arquivo de texto atualizado pelo aplicativo filho com os valores de resultado. Agora eu não tenho certeza de como podemos conseguir isso de uma maneira simples A arquitetura não pode ser alterada. Muito obrigado antecipadamente. Cumprimentos. Quarta-feira, 27 de abril de 2017 17:42 Respostas Eu não usaria um arquivo de texto para isso. Gostaria de usar pipes nomeados. De qualquer forma para notificar o segundo aplicativo / processo que eu iria usar o sistema ou global mutexes nomeado. Você pode acessar este mutex de ambos os processos. Um processo pode configurá-lo e o outro processo está aguardando. Proposta como resposta por Konrad Neitzel Quinta-feira, 28 de abril de 2017 5:18 Marcada como resposta por Kristin Xie Equipe de contingentes da Microsoft, Moderador Sexta-feira, 06 de maio de 2017 1:19 AM Quarta-feira, 27 de abril de 2017 6:45 PM Há diferentes maneiras Para comunicar entre processos. Aqui estão algumas opções para você explorar e avaliar de acordo com seus requisitos específicos: O aplicativo filho deve enviar uma mensagem para o aplicativo pai usando qualquer técnica que você escolher antes de ser desligado. Por exemplo, no evento Form. Closing: msdn. microsoft/en-us/library/system. windows. forms. form. closing28vvs.11029.aspx Espero que ajude. Lembre-se de fechar seus tópicos marcando posts úteis como resposta e, em seguida, iniciar um novo tópico se você tiver uma nova pergunta. Por favor, não faça várias perguntas no mesmo tópico. Proposto como resposta por Konrad Neitzel Quinta-feira, 28 de abril de 2017 5:17 Marcado como resposta por Kristin Xie Equipe de contingentes da Microsoft, Moderador Sexta-feira, 06 de maio de 2017 1:19 AM Quarta-feira, 27 de abril de 2017 20h32 Normalmente você começa O aplicativo filho via Process. Start (). Wich também significa que você pode facilmente esperar para o processo para sair usando Process. WaitForExit (). Se a aplicação pai tem uma interface gráfica e a criança precisa de qualquer tempo visível humano para processamento, obter dificuldade porque o WaitForExit seria bloquear o segmento GUI devido a ser uma chamada de bloqueio. A multitarefa ou Threading seria necessário para ser adicionado ao aplicativo pai neste caso. Mas que é um independentes preocupação e devem ser reasked como seperate pergunta. No entanto, esta é uma maneira muito ruim para fazer interprocess comunicação. Encontrar um lugar onde você pode escrever um arquivo pode ser muito complicado. Como um mater, é claro, apenas asume direitos de gravação para as Pastas Especiais do usuário. Recupere o caminho através da Enumeração Specialfolders. Uma ligeira melhoria seria dar os nomes de arquivo (para o arquivo de entrada e saída) via Commandline Parameters, em vez de codificá-lo. Talvez até mesmo dar a entrada completa através de parâmetros (se possível dentro das restrições de linha de comando). Entretanto, para uma comunicação interprocessa séria você deve ir para qualquer um dos appraoches dedicados: Comunicação de rede que alveja o dispositivo do Loopback. Pipes nomeados e sem nome no modo de mensagem. MemoryMapped ou memória compartilhada. Há um monte de abordagens adequadas para IPC com um monte de encanamento tomado cuidado para você. As épocas em que você teve que fazer sua própria programação do soquete apenas para algum IPC são por muito tempo. E os outros cartazes explicam-los muito bem. Proposto como resposta por Konrad Neitzel Quinta-feira, 28 de abril de 2017 5:17 Marcado como resposta por Kristin Xie Equipe de contingentes da Microsoft, Moderador sexta-feira, 06 de maio de 2017 1:19 AM Wednesday, April 27, 2017 10:03 PM Aqui estão alguns Opções para você explorar e avaliar de acordo com seus requisitos específicos: O aplicativo filho deve enviar uma mensagem para o aplicativo pai usando qualquer técnica que você escolher antes de ser desligado. Por exemplo, no evento Form. Closing: msdn. microsoft/en-us/library/system. windows. forms. form. closing28vvs.11029.aspx Espero que ajude. Lembre-se de fechar seus tópicos marcando posts úteis como resposta e, em seguida, iniciar um novo tópico se você tiver uma nova pergunta. Por favor, não faça várias perguntas no mesmo tópico. Proposto como resposta por Konrad Neitzel Quinta-feira, 28 de abril de 2017 5:17 Marcado como resposta por Kristin Xie Equipe de contingentes da Microsoft, Moderador Sexta-feira, 06 de maio de 2017 1:19 AM Quarta-feira, 27 de abril de 2017 20h32 Normalmente você começa O aplicativo filho via Process. Start (). Wich também significa que você pode facilmente esperar para o processo para sair usando Process. WaitForExit (). Se a aplicação pai tem uma interface gráfica e a criança precisa de qualquer tempo visível humano para processamento, obter dificuldade porque o WaitForExit seria bloquear o segmento GUI devido a ser uma chamada de bloqueio. A multitarefa ou Threading seria necessário para ser adicionado ao aplicativo pai neste caso. Mas que é um independentes preocupação e devem ser reasked como seperate pergunta. No entanto, esta é uma maneira muito ruim para fazer interprocess comunicação. Encontrar um lugar onde você pode escrever um arquivo pode ser muito complicado. Como um mater, é claro, apenas asume direitos de gravação para as Pastas Especiais do usuário. Recupere o caminho através da Enumeração Specialfolders. Uma ligeira melhoria seria dar os nomes de arquivo (para o arquivo de entrada e saída) via Commandline Parameters, em vez de codificá-lo. Talvez até mesmo dar a entrada completa através de parâmetros (se possível dentro das restrições de linha de comando). Entretanto, para uma comunicação interprocessa séria você deve ir para qualquer um dos appraoches dedicados: Comunicação de rede que alveja o dispositivo do Loopback. Pipes nomeados e sem nome no modo de mensagem. MemoryMapped ou memória compartilhada. Há um monte de abordagens adequadas para IPC com um monte de encanamento tomado cuidado para você. As épocas em que você teve que fazer sua própria programação do soquete apenas para algum IPC são por muito tempo. E os outros cartazes explicam-los muito bem. Proposto como resposta por Konrad Neitzel Quinta-feira, 28 de abril de 2017 5:17 Marcado como resposta por Kristin Xie Pessoal contingente Microsoft, Moderador sexta-feira, 06 de maio de 2017 1:19 quarta-feira, 27 de abril de 2017 10:03

No comments:

Post a Comment