0

次のコードは、「StandardOut がリダイレクトされていないか、プロセスがまだ開始されていません」というエラーを示しています。このコードの問題は何ですか? 変更が必要ですか?例外をキャッチして常にプロセスをクリアします。

static void ExecuteAsync()
            {
                if (File.Exists("Videos/output.flv"))
                try
                {
                    File.Delete("Videos/output.flv");
                }
                catch
                {
                    return;
                }

            try
            {
                process = new Process();
                ProcessStartInfo info = new ProcessStartInfo(@"e:\ffmpeg\bin\ffmpeg.exe", "-i cars1.flv -same_quant intermediate1.mpg");
                info.CreateNoWindow = false;
                info.UseShellExecute = false;
                info.RedirectStandardError = true;
                info.RedirectStandardOutput = true;
                process.StartInfo = info;
                process.EnableRaisingEvents = true;
                process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
                process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
                process.Exited += new EventHandler(process_Exited);
                process.Start();
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
            }
            catch (Exception ex)
            {
                if (process != null) process.Dispose();
            }
        }
        static int lineCount = 0;
        static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Input line: {0} ({1:m:s:fff})", lineCount++, DateTime.Now);
            Console.WriteLine(e.Data);
            Console.WriteLine();
        }

        static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Output Data Received.");
        }

        static void process_Exited(object sender, EventArgs e)
        {
            process.Dispose();
            Console.WriteLine("Bye bye!");
        }
    }
4

1 に答える 1

2

これを false に設定します。

info.RedirectStandardOutput = false;

ドキュメンテーションは言う:

StandardOutput を使用するには、ProcessStartInfo..::.UseShellExecute を false に設定し、ProcessStartInfo..::.RedirectStandardOutput を true に設定する必要があります。それ以外の場合、StandardOutput ストリームから読み取ると例外がスローされます。

于 2012-05-03T13:01:27.480 に答える