Saturday 9 December 2017

Assinalação de waitforexit


Pareceu-me que este sistema de assincronia era uma solução gloriosa para um problema que eu tenho tido onde eu preciso iniciar um processo externo e depois esperar para que ele seja concluído. Atualmente, eu tenho o seguinte código no subtítulo UI: processar processo novo processo () process. Start () process. WaitForExit () O processo geralmente leva vários segundos, mas Ive resistiu usando um trabalhador em segundo plano ou similar porque simplesmente não acontece com frequência O suficiente para valer a pena o esforço e codificação de código. Eu vi menção de métodos de extensão no whitepaper, mas parece não haver nenhum método de extensão para process. RunAsync () ou algo semelhante, deixando quotawait TaskEx. Run (() gt process. WaitForExit ()) quot como a única solução que parece Como funciona. Girar um fio extra apenas para chamar WaitForExit parece bastante estúpido. Eu também não encontrei nenhum método estático que parecia promissor em qualquer AsyncCtpExtensions, AsyncCtpThreadingExtensions, TaskEx ou TaskExtensions. Existe uma maneira planejada (planejada) para aguardar a conclusão do processo externo. Sexta-feira, 29 de outubro de 2010 18:35 A desvantagem para usar o pool dessa maneira é que você estará bloqueando um segmento durante o período do processo. Se você não está girando muitos processos, isso pode não ser um grande problema, mas ainda não há necessidade real de fazê-lo. Em vez disso, você pode usar uma tarefa que não está vinculada a um tópico, p. Public static Task ExitedAsync (este Processo p) var tcs new TaskCompletionSourceltobjectgt () p. Exited 43 (s, e) gt tcs. TrySetResult (nulo) se (p. HasExited) tcs. TrySetResult (nulo) retorna tcs. Task Com isso, Você pode escrever: e você não estará bloqueando nenhum segmento enquanto espera assíncronamente o processo para sair. Proposto como resposta por Stephen Toub - empregado da MSFT Microsoft, Moderador sexta-feira, 29 de outubro de 2010 9:29 PM Marcado como resposta por Lucian Wischik, empregado da MSFT Microsoft, proprietário sábado, 30 de outubro de 2010 22:13 sexta-feira, 29 de outubro de 2010 9:28 PM quot Girar um fio extra apenas para chamar WaitForExit parece bastante estúpido. Se você usa a funcionalidade TPL padrão, por padrão, ele usará um thread ThreadPool. Realmente não deveria haver muito tempo de espera para cobrir o tópico. Uma vez que isso é algo que quase não acontece com bastante frequência para valer a pena o esforço e codificação de código. Id apenas use: Reed Copsey, Jr. - reedcopsey Se uma postagem responde sua pergunta, clique em quot Mark As Answer no quê e quot Marque como útil. Sexta-feira, 29 de outubro de 2010 7:30 PM A desvantagem de usar o pool dessa maneira é que você estará bloqueando um segmento durante o período do processo. Se você não está girando muitos processos, isso pode não ser um grande problema, mas ainda não há necessidade real de fazê-lo. Em vez disso, você pode usar uma tarefa que não está vinculada a um tópico, p. Public static Task ExitedAsync (este Processo p) var tcs new TaskCompletionSourceltobjectgt () p. Exited 43 (s, e) gt tcs. TrySetResult (nulo) se (p. HasExited) tcs. TrySetResult (null) retorna tcs. Task Com isso, Você pode escrever: e você não estará bloqueando nenhum segmento enquanto espera assíncronamente o processo para sair. Proposto como resposta por Stephen Toub - empregado da MSFT Microsoft, Moderador sexta-feira, 29 de outubro de 2010 9:29 PM Marcado como resposta por Lucian Wischik, empregado da MSFT Microsoft, proprietário sábado, 30 de outubro de 2010 22:13 sexta-feira, 29 de outubro de 2010 9:28 PMProcesso. BeginOutputReadLine Method () O fluxo StandardOutput pode ser lido de forma síncrona ou assíncrona. Métodos como Read. Leia a linha. E ReadToEnd executam operações de leitura síncrona no fluxo de saída do processo. Essas operações de leitura síncrona não são concluídas até que o Processo associado grava seu fluxo StandardOutput ou encerre o fluxo. Em contraste, BeginOutputReadLine inicia operações de leitura assíncronas no fluxo StandardOutput. Este método habilita um manipulador de eventos designado para a saída do fluxo e retorna imediatamente ao chamador, o que pode executar outro trabalho enquanto a saída do fluxo é direcionada para o manipulador de eventos. Siga estas etapas para executar operações de leitura assíncronas no StandardOutput para um processo. Adicione seu manipulador de eventos ao evento OutputDataReceived. O manipulador de eventos deve corresponder ao System. Diagnostics. DataReceivedEventHandler delegar assinatura. Ligue BeginOutputReadLine para o processo. Esta chamada inicia operações de leitura assíncronas no StandardOutput. Quando as operações de leitura assíncronas começam, o manipulador de eventos é chamado cada vez que o Processo associado grava uma linha de texto em seu fluxo StandardOutput. Você pode cancelar uma operação de leitura assíncrona chamando CancelOutputLit. A operação de leitura pode ser cancelada pelo chamador ou pelo manipulador de eventos. Após o cancelamento, você pode chamar BeginOutputReadLine novamente para continuar as operações de leitura assíncronas. Você não pode misturar operações de leitura assíncronas e síncronas em um fluxo redirecionado. Uma vez que o fluxo redirecionado de um Processo é aberto em modo assíncrono ou síncrono, todas as operações de leitura adicionais nesse fluxo devem estar no mesmo modo. Por exemplo, não siga BeginOutputReadLine com uma chamada para ReadLine no fluxo StandardOutput ou vice-versa. No entanto, você pode ler dois fluxos diferentes em modos diferentes. Por exemplo, você pode chamar BeginOutputReadLine e, em seguida, chamar ReadLine para o fluxo StandardError.

No comments:

Post a Comment