【问题标题】:Async Threads beginoutputreadline c#异步线程beginoutputreadline c#
【发布时间】:2018-06-06 10:02:11
【问题描述】:

我编写了一个控制台程序,该程序从另一个控制台程序提供数据,该程序在 3 秒或更长时间后频繁写入数据行,因此我尝试通过 BeginOutputReadLine 从控制台读取输出数据,这是一个异步方法和 OutputDataRecieved 事件,但在读取了一些线程退出并进入 3 分钟或更长时间的间隔,我应该怎么做才能防止这个间隔?

using System.Diagnostics;

namespace FirstTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo info = new ProcessStartInfo("start.bat")
            {
                UseShellExecute = false,
                RedirectStandardOutput = true
            };
            Process process = new Process() { StartInfo = info };
            process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
            {               
                Debug.WriteLine(e.Data);
            });
            process.EnableRaisingEvents = true;

            process.Start();
            process.BeginOutputReadLine();
            while (true) ;
        }
    }
}

调试输出如下:

线程 0x2030 已退出,代码为 0 (0x0)。

线程 0x3b2c 已退出,代码为 0 (0x0)。

【问题讨论】:

    标签: c# multithreading asynchronous process


    【解决方案1】:

    尝试使用以下代码从进程对象中读取输出流:

    ProcessStartInfo info = new ProcessStartInfo()
    {
        RedirectStandardOutput = true,
        FileName = "start.bat",
        UseShellExecute = false,
        CreateNoWindow = true
    };
    var process = new Process {
        StartInfo = info
    };
    

    然后启动进程并从中读取:

    process.Start();
    while (!process.StandardOutput.EndOfStream) {
        var outputLine = process.StandardOutput.ReadLine();
        // do something with the outputLine
    }
    

    【讨论】:

    • 哦,我花了一整天的时间来解决这个问题。我正在评论,所以谷歌发现这更好,因为它确实帮助我解决了 ActionBlock 没有完成所有任务的问题,结果随机丢失。老实说,我认为 ActionBlock 有一个错误。原来 BeginOutputReadLine 把一切都搞砸了。
    猜你喜欢
    • 2021-11-22
    • 2017-09-13
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多