SORU
26 EYLÜL 2008, Cuma


Processstartınfo asılı ""? WaitForExit Neden?

Aşağıdaki kodu var:

info = new System.Diagnostics.ProcessStartInfo("TheProgram.exe", String.Join(" ", args));
info.CreateNoWindow = true;
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
System.Diagnostics.Process p = System.Diagnostics.Process.Start(info);
p.WaitForExit();
Console.WriteLine(p.StandardOutput.ReadToEnd()); //need the StandardOutput contents

Başlıyorum sürecin çıktısını 7 MB kadar uzun olduğunu biliyorum. Windows çalışan konsol gayet iyi çalışıyor. Ne yazık ki bu program aracılığıyla WaitForExit de süresiz olarak askıda kalıyor. Bu kodu daha küçük çıkışlar için (3KB gibi) asmak not da vermez.

Processstartınfo iç StandardOutput 7 MB tampon yok olması mümkün mü? Eğer öyleyse, ne yapmalıyım? , Neyi yanlış yapıyorum?

CEVAP
30 EYLÜL 2011, Cuma


Sorun varsa StandardOutput ve/veya StandardError yönlendirirseniz iç arabellek dolu hale gelebilir. Ne olursa olsun, eğer bir sorun olabilir

  • Eğer işlemi için StandardOutput süreç okumadan önce çıkmak için beklerseniz bunu yazmak engelleyebilirsiniz, bu süreç hiç bitmeyecek.
  • StandardOutput ReadToEnd kullanarak okuyunseninişlem süreci asla StandardOutput (StandardError yazılı engellenirse eğer asla sona erer, örneğin, ya da kapatır engelleyebilirsiniz.

Çözüm asenkron arabelleğin dolmasını sağlamak için okur kullanmaktır. Herhangi bir kilitlenme önlemek ve mümkün StandardOutput StandardError tüm çıkış toplamak için:

EDİT: aşağıdaki cevaplar için zaman aşımı işlemek ve önlemeObjectDisposeExceptionözel durumlar.

using (Process process = new Process())
{
    process.StartInfo.FileName = filename;
    process.StartInfo.Arguments = arguments;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;

    StringBuilder output = new StringBuilder();
    StringBuilder error = new StringBuilder();

    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
    using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
    {
        process.OutputDataReceived  = (sender, e) => {
            if (e.Data == null)
            {
                outputWaitHandle.Set();
            }
            else
            {
                output.AppendLine(e.Data);
            }
        };
        process.ErrorDataReceived  = (sender, e) =>
        {
            if (e.Data == null)
            {
                errorWaitHandle.Set();
            }
            else
            {
                error.AppendLine(e.Data);
            }
        };

        process.Start();

        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        if (process.WaitForExit(timeout) &&
            outputWaitHandle.WaitOne(timeout) &&
            errorWaitHandle.WaitOne(timeout))
        {
            // Process completed. Check process.ExitCode here.
        }
        else
        {
            // Timed out.
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • jeffisthecoolguy

    jeffisthecoo

    17 HAZİRAN 2013
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011