C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 37 を表示中)
■19106 / )  Re[4]: Processの標準出力をリアルタイム取得
□投稿者/ シャノン (434回)-(2008/05/20(Tue) 12:23:20)
No19103 (れい さん) に返信
> ■No19096 (シャノン さん) に返信
>>これバグくさいなー。
> 
> pingの、ですね。

そうなのかな?
コンソールアプリは出力時に \r\n ではなく \n を使うべし、というガイドラインはどこかにあったっけ?
例えばここ
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html
では、出力を受ける側で \r\r\n に対応してるけど。

> >>GetDecoderしてDecoder取っておかないと、文字が化けちゃいます。
>>
>>え、そうなの?
> 
> OutputEncodingがUTF-16なときに
> 3バイトの読み込みで返ってきたりしたら切れちゃいますよ。
> 必ず偶数まで読む、なんて保証はないですから。

なるほど。勉強勉強。

>>StreamReader を使うというのは良くわからんが。
> StreamReaderに折角「改行まで読む」というメソッドがあるのに使わないのはもったいないというだけです。

あー、ReadLine を非同期で呼べと。
非同期デリゲートは使おうと思わなかったなぁ。

というわけでれいさんのをパクった非同期デリゲート版。

private delegate string ReadLine();
private static void Ping3()
{
    using (Process p = new Process())
    {
        p.StartInfo.FileName = "ping.exe";
        p.StartInfo.Arguments = "127.0.0.1";
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.UseShellExecute = false;

        p.Start();

        for(;;)
        {
            ReadLine ln = p.StandardOutput.ReadLine;
            IAsyncResult ar = ln.BeginInvoke(null, null);
            ar.AsyncWaitHandle.WaitOne();
            string line = ln.EndInvoke(ar);
            if (line == null)
            {
                break;
            }

            Console.WriteLine(line);
        }
    }

    Console.WriteLine();
    Console.WriteLine("Complete");
}

やっぱり改行が \r\r\n になるおまけつき。

返信 編集キー/


管理者用

- Child Tree -