我有一个过程,我可以开始,隐藏工作正常,但我想从控制台程序读取,当我运行,而不是之后,我试图运行一个计时器,ABD读取蜱,但我的程序只是崩溃和当它不这样做,我什么也得不到。
startInfo= new ProcessStartInfo("cmd.exe"); startInfo.Arguments ="/C uus.exe "+ arg.ToString(); startInfo.RedirectStandardError = true; startInfo.RedirectStandardOutput = true; startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; this.timer1.Enabled=true; this.listBox1.Items.Clear(); p= Process.Start(startInfo); Application.DoEvents(); void Timer1Tick(object sender, EventArgs e) { string str=""; str=p.StandardOutput.ReadLine(); if(str != null) { this.Text=str.ToString(); this.listBox1.Items.Add(str); } Application.DoEvents(); }
那么我该怎么做才能解决这个问题?
更新:我现在试着弯曲build议我的程序不再崩溃,但也不recvie任何数据
proc.StartInfo.UseShellExecute=false; proc.StartInfo.CreateNoWindow=true; proc.StartInfo.RedirectStandardOutput=true; proc.StartInfo.RedirectStandardError=true; proc.StartInfo.FileName="uus.exe"; proc.StartInfo.Arguments=arg; proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(SortOutputHandler); proc.Start(); proc.BeginOutputReadLine(); void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) { string str=""; string str2=""; str=e.Data.ToString(); if(str!=null && str!="") { this.listBox1.Items.Add(str.ToString()); this.Text=str.ToString(); } str2=proc.StandardOutput.ReadLine(); if(str2!=null && str2!="") { this.lsw1.Items.Add(str2.ToString()); } }
嗯?
更新:我已经改变了处理程序,因为我已经告诉,它不能这样做,它将是跨线程操作,通常我会得到一个错误,如果是的话。
private delegate void TextAdderDelegate(string str); void TextAdder(string str) { if(this.lsw1.InvokeRequired==true) { Invoke(new TextAdderDelegate(TextAdder),new object[] {str}); } else { this.lsw1.Items.Add(str); } } void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) { string str=""; if(e!=null) { if(e.Data!=null) { str=e.Data.ToString(); } } TextAdder(str); }
问题是你在一个线程上运行,并试图用另一个线程写。 当你使用Timer的tick事件创建你的后台线程时,它不能有前端用户输入。
也许如果你解释了你想要完成的事情的全貌,我们可以更好地帮助你。
同时,您可能想要创建线程安全写入。 本文将帮助您了解在不同线程上编写控件的问题和解决方案。
您可以显式创建Process实例(例如new Process
),并在完成CancelOutputRead()
时使用OutputDataReceived
事件,方法BeginOutputReadLine()
。
当输出数据可用时,事件OutputDataReceived
将从不同的线程异步调用。
我假设你得到一个'线程交叉异常',这可能是因为你正在更新你的表单控件在另一个线程,然后是UI线程。