Process.start指定为UseShellExecute=false的问题

iamcooky 2010-04-22 11:45:13
1. ProcessStartInfo startInfo = new ProcessStartInfo("WTTCheck\\WTTCheck.exe", argString);
2. startInfo.UseShellExecute = false;
3. startInfo.RedirectStandardOutput = true;
4. startInfo.RedirectStandardError = true;
5. Process wttProc = Process.Start(startInfo);
6. wttProc.WaitForExit();
7. string output = wttProc.StandardOutput.ReadToEnd();
8. string err = wttProc.StandardError.ReadToEnd();
在上面的代码中,如果我去掉2,3,4行,到第5行和第6行就可以正常执行,但是只要我加上2,3,4行,到第6行时程序就会停止不动,我看任务管理器显示程序"WTTCheck.exe"已经被启动了,但是cpu消耗为0。请高手帮忙解答一下原因。为什么使用了UseShellExecute=false之后同样的程序就停在那里不动了?
在线等,紧急!
...全文
4309 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff_1211 2010-11-26
  • 打赏
  • 举报
回复
凑凑热闹
cgp2008 2010-10-08
  • 打赏
  • 举报
回复
看看先
特别安静 2010-04-22
  • 打赏
  • 举报
回复
不是很懂,帮顶
iamcooky 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 g394594141 的回复:]
UseShellExecute=false 不用系统默认的程序打开,所以在你没有指定用什么程序打开时,线程就一直等待。
而UserShellExecute默认值是true,所以你注释掉时,它会用默认的程序打开你需要打开的文件,便能继续执行下去。

以上是我的拙见,对这个也不是太懂,没怎么用过
[/Quote]
我尝试过打开其他的程序如notepad或者改变我要打开程序的参数,设置UseShellExecute=false是可以打开的。
铛铛 2010-04-22
  • 打赏
  • 举报
回复
其实我也想知道UseShellExecute 是干吗用的
g394594141 2010-04-22
  • 打赏
  • 举报
回复
UseShellExecute=false 不用系统默认的程序打开,所以在你没有指定用什么程序打开时,线程就一直等待。
而UserShellExecute默认值是true,所以你注释掉时,它会用默认的程序打开你需要打开的文件,便能继续执行下去。

以上是我的拙见,对这个也不是太懂,没怎么用过
doo1314 2010-04-22
  • 打赏
  • 举报
回复
专业帮顶 防止沉水
xingyuebuyu 2010-04-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100224/11/52970c74-6760-4176-bd83-62ad86efb688.html

重定向输出后采用异步读取的方式就可以了,不需要调用wttProc.WaitForExit();等待完成.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Diagnostics;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Process p = new Process();
p.StartInfo.FileName = "format.com";
p.StartInfo.Arguments = " G: /FS:FAT /Q";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;//true表示不显示黑框,false表示显示dos界面
p.StartInfo.UseShellExecute = false;


p.EnableRaisingEvents = true;

p.Exited += new EventHandler(p_Exited);
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);

p.Start();
p.StandardInput.WriteLine("");
p.StandardInput.WriteLine("");

//开始异步读取输出
p.BeginOutputReadLine();
p.BeginErrorReadLine();

//调用WaitForExit会等待Exited事件完成后再继续往下执行。
p.WaitForExit();
p.Close();

Console.WriteLine("exit");

}

void p_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里是正常的输出
Console.WriteLine(e.Data);

}

void p_ErrorDataReceived(Object sender, DataReceivedEventArgs e)
{
//这里得到的是错误信息
Console.WriteLine(e.Data);

}

void p_Exited(Object sender, EventArgs e)
{
Console.WriteLine("finish");
}

}
}
skep99 2010-04-22
  • 打赏
  • 举报
回复
楼上正解
zsuswy 2010-04-22
  • 打赏
  • 举报
回复
程序你启动后,这程序做完自己的事情了,他本身就是会停在那里,没有干活,cpu为0很正常。
另外,并不是所有的程序你都能获得它的输出,因为他不输出东西你自然获取不到输出了。
另外,程序执行完,你不在程序里面主动关闭的话,他肯定是挂在那里不动。不象一些bat或者cmd里面执行一些命令。
iamcooky 2010-04-22
  • 打赏
  • 举报
回复
为什么感觉大家都答非所问啊。
我设置了UseShellExecute为false,是为了重定向输出,从而能够读取输出。
在我设置为false的时候,用Process.Start执行一些程序是没问题的,但是执行特定的程序(而这个特定的程序单独执行或者不设置为false时执行都没问题)时就会停止不动,我想知道这是什么原因。
期待高手解答一下。
zsuswy 2010-04-22
  • 打赏
  • 举报
回复
解释下:
若要在启动进程时使用外壳程序,则为 true;否则,直接从可执行文件创建进程。将属性设置为 false 能够重定向输入流、输出流和错误流。否则不行。
使用操作系统外壳程序启动进程时,可以使用 Process 组件启动任何文档(可以是与可执行文件关联的、具有默认打开操作的任何注册文件类型),并对该文件执行操作(如打印)。如果 UseShellExecute 为 false,则只能使用 Process 组件启动可执行文件。
oneatree 2010-04-22
  • 打赏
  • 举报
回复
mark
yangyang8848 2010-04-22
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.useshellexecute(VS.80).aspx
iamcooky 2010-04-22
  • 打赏
  • 举报
回复
高手帮忙看一下啊
wuyq11 2010-04-22
  • 打赏
  • 举报
回复
UseShellExecute表示是否从控制台启动。如果想从标准输出流中读取输出,这个属性必需设为False
若要使用 StandardOutput,必须将 ProcessStartInfo.UseShellExecute 设置为 false,并且将ProcessStartInfo.RedirectStandardOutput 设置为 true

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧