C# 如何在C语言中将控制台应用程序连续输出到文本文件#

C# 如何在C语言中将控制台应用程序连续输出到文本文件#,c#,.net,console-application,tshark,C#,.net,Console Application,Tshark,我试图用参数打开一个隐藏的控制台应用程序,基本上将其输出连续记录到一个文件中,直到停止为止 我尝试过使用一个内存流并将其写入文件中,它似乎确实起了一些作用。现在我试图利用DataReceiveDevent,以便进一步处理输出。现在我没有得到任何输出 以下是我如何打开console应用程序: StreamWriter writer = new StreamWriter("tsharkfieldoutput.txt", true) private void capturePackets(int d

我试图用参数打开一个隐藏的控制台应用程序,基本上将其输出连续记录到一个文件中,直到停止为止

我尝试过使用一个内存流并将其写入文件中,它似乎确实起了一些作用。现在我试图利用DataReceiveDevent,以便进一步处理输出。现在我没有得到任何输出

以下是我如何打开console应用程序:

StreamWriter writer = new StreamWriter("tsharkfieldoutput.txt", true)

private void capturePackets(int device)
        {

           string path =
                string.Format("-i " + device +
                              "  -O SNMP -T fields -e snmp.value.oid -e snmp.VarBind -e snmp.variable_bindings -e snmp.value.octets -e snmp.name -R udp src " +
                              destPort);
           string tshark = @"C:\Program Files\Wireshark\tshark.exe";
           ProcessStartInfo ps = new ProcessStartInfo();
           ps.FileName = tshark;
           ps.CreateNoWindow = true;
           ps.WindowStyle = ProcessWindowStyle.Hidden;
           ps.UseShellExecute = false;
           ps.CreateNoWindow = true;
           ps.RedirectStandardOutput = true;
           ps.Arguments = path;
           Process process = new Process();
           process.StartInfo = ps;
           process.Start();
           process.OutputDataReceived += new DataReceivedEventHandler(tshark_OutputDataReceived);
            //Not using stream reader any more.
           //StreamReader myStreamReader = process.StandardOutput;
            writer.Write("Begin tshark output- " + DateTime.Now + " - " + Environment.NewLine);

        }

        private void tshark_OutputDataReceived(object sender, DataReceivedEventArgs arg)
        {
            string tsharkline = arg.Data; //arg.Data contains the output data from the process...        

                writer.Write(tsharkline);

        }

我认为问题在于,在函数capturePackets结束时,您对流程的引用超出了范围。您需要为流程变量指定与writer相同的作用域,或者使用WaitForExit()方法在capturePackets函数中等待流程退出。尽管您创建的流程将继续运行,但当对它的引用超出范围(通过流程变量)时,事件将停止处理。

只是一个旁注,但StreamWriter是一次性的,应该包装在“Using语句”中,或者在您完成当前操作时调用Dispose()。谢谢。我实际上是用using语句包装它,然后出于调试目的删除了它。感谢您的建议,我现在正在使用.Dispose()。您知道,我实际上已经想到了这一点,并且完全忘记了.WaitForExit方法,并且打算编写一个方法来不断检查PID,看看它是否已经退出。不过,这确实奏效了,谢谢。