Executa rapidamente comandos sem ficar sem memória [closed]

1

Estou escrevendo um aplicativo .Net que é executado no Mono. Ele executa e obtém a saída de vários comandos do terminal a cada segundo, continuamente.

No entanto, após alguns segundos, ele falhará porque a saída é nula.

Após uma inspeção adicional, isso ocorre devido ao processo ter falhado porque ficou sem memória, por exemplo:

ERROR: System.ComponentModel.Win32Exception: ApplicationName='upower', CommandLine='-i /org/freedesktop/UPower/devices/battery_BAT0', CurrentDirectory='', Native error= Out of memory

Existe uma maneira de executar rapidamente os comandos enquanto limpa a memória usada após o uso para que não fique sem memória?

Estou executando os comandos assim:

 Dim ret As String = ""
 Dim proc As New System.Diagnostics.Process()
 proc.StartInfo.FileName = file 'i.e upower
 proc.StartInfo.Arguments = arguments 'i.e. -i /org/freedesktop/UPower/devices/battery_BAT0
 proc.StartInfo.UseShellExecute = False
 proc.StartInfo.RedirectStandardOutput = True
 proc.Start()
 ret = proc.StandardOutput.ReadToEnd()
 proc.WaitForExit()
 Return ret

A execução de "Mono --version" retorna a versão 3.2.8, se isso ajudar.

Eu até tentei colocar proc.WaitForExit() antes de ler a saída, mas isso não ajudou.

    
por TheRyan722 08.02.2016 / 19:45

1 resposta

1

Antes: proc.Start()

Adicione um método de manipulador. Por exemplo: process.OutputDataReceived += (sender, a) => Console.WriteLine(a.Data);

e substitua esta linha: ret = proc.StandardOutput.ReadToEnd()

com isso: process.BeginOutputReadLine();

Como alternativa, você também pode simplesmente tentar adicionar apenas process.BeginOutputReadLine() após ret = proc.StandardOutput.ReadToEnd() em seu código original (so adicionando apenas uma linha com a chamada para BeginOutputReadLine). Isso deve impedir um deadlock no fluxo StandardError.

Boa sorte!

    
por E.F. Nijboer 08.02.2016 / 19:55