我阅读了Process.StandardOutput的文档,其中包含以下引用:
如果父进程在p.StandardOutput.ReadToEnd之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能导致死锁条件.
所以我很想知道.如果我还害怕在某些情况下可以填充StandardError,那么正确的方法是什么?
我是否必须使用循环来交替读取标准输出和错误,以避免填充,或者这个简单的代码是否足够:
string error = proc.StandardError.ReadToEnd();
string output = proc.StandardOutput.ReadToEnd();
bool didFinish = proc.WaitForExit(60000);
Run Code Online (Sandbox Code Playgroud)
在发布了一些答案后编辑
那么这是正确的方法吗?
var output = new StringBuilder();
proc.OutputDataReceived += (s, e) => output.Append(e.Data);
proc.BeginOutputReadLine();
string error = proc.StandardError.ReadToEnd();
bool didFinish = proc.WaitForExit(60000);
Run Code Online (Sandbox Code Playgroud)
然后我只在进程实际完成时才使用stringbuilder内容.
这是正确的方法吗?
所以我一直在与这个问题作斗争一段时间,并尝试了许多不同的方法来解决它,但不能.
基本上我的应用程序是调用java文件来加载设备上的应用程序.当它正在加载它将它打印到richtext框时,我想转到下一个文件.我遇到的问题是,当第一个文件被加载时,第二个文件尝试加载哪些情况问题.我已经尝试了等待退出,但如果我这样做,那么输出数据就不会写入富文本框.有任何想法吗?
private void btnLoad_Click(object sender, EventArgs e)
{
rchsdtOut.Clear();
//count the items in queue.
var count = lstBarToLoad.Items.Count;
if (count <= 0)
{
MessageBox.Show("Nothing added to the load queue");
}
else
{
String toLoad;
for (int i=0; i < count;i++)
{//START OF FOREACH
toLoad = lstBarToLoad.Items[i].Text;
//call load method.
loaddPB(toLoad);
}//end of for.
}//end of else.
}//end of private
Run Code Online (Sandbox Code Playgroud)
我尝试在许多不同的地方等待退出,但它似乎不起作用.
//Method to load files on device.
private void loaddPB(string toLoad)
{
process1 = new System.Diagnostics.Process();
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardOutput …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual C#2005(net framework 2)创建一个GUI应用程序.我使用以下代码来启动一个过程:
Process process = new Process();
process.StartInfo = new ProcessStartInfo("app.exe");
process.StartInfo.WorkingDirectory = "";
process.StartInfo.Arguments = "some arguments";
process.Start();
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
我希望我的应用程序等到这个过程结束,所以我使用了WaitForExit.但是,当app.exe运行时,GUI Windows会冻结.我希望它响应(例如按下取消按钮),但我不希望代码继续,因为还有另一个进程要启动.提前致谢!
我正在调用第三方应用程序,它"有时"在VB.NET中运行(它是一个自托管的WCF).但有时第三方应用程序将永远挂起,所以我已经添加了一个90秒的计时器.问题是,我如何知道事情是否超时?
代码如下所示:
Dim MyProcess as System.Diagnostics.Process = System.Diagnostics.Process.Start(MyInfo)
MyProcess.WaitForExit(90000)
Run Code Online (Sandbox Code Playgroud)
我想做的就是这样
If MyProcess.ExceededTimeout Then
MyFunction = False
Else
MyFunction = True
End If
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢,
贾森