请教:C#windows服务通过CMD启动程序的释放问题 本帖最后由 djfemg 于 2011-04-15 15:06:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 根据你的描述,在Service中,默认以System权限运行,如果改成本地系统账户,则默认会启动,但是不会以Process进程显示交互程序界面,因为图形界面需要explorer.exe系统进程,交互界面程序需要用户登陆后才会启动,所以如果你的Service是以Process进程打开的话,那么很可能Service被阻塞在Process Start这一步操作上;对于windows服务,建议分开处理,更改如下:1.windows服务不要设置”本地系统账户”,默认System最高权限即可,不需要在服务里做Process服务启动交互界面2.在开始-启动菜单里添加交互界面启动,用户登陆即可启动程序 你说的先后问题,我也没有考虑进去,因为我测试的时候,正常启动系统后,通过net start 和net stop 调用服务的,这个时候explorer.exe已经存在了。目前情况是如果不以System权限运行,无论服务停不停止都不会正常使用。我觉得关键应该在于释放不释放的问题,怎么解释存在那么多个cmd进程呢 1.用日志记录Process调用CMD执行次数,看看是否多次调用了2.这个Process和Disponse没有关系,一旦Process启动CMD后,Process则会自动由GC处理回收,不会长期驻留内存,我觉得这个地方可能是你系统出现多个CMD进程的原因,如果你在P.Start后立刻判断交互界面是否启动,这样就会出现重复操作,CMD是一个进程指令,添加一个等待指令我觉得可以解决Process p; p.Start(); p.WaitForExit();WaitForExit将会阻塞服务,直到CMD退出后才会继续执行 我代码是:Process p = new Process();p.StandardInput.WriteLine(“c:\123.exe”);StreamReader reader = p.StandardOutput;//CMD窗口返回的信息p.StandardOutput.Close();p.StandardError.Close();p.Close();reader.Close();应该不存在WaitForExit将会阻塞服务吧?已经直接close掉了 你提了一下我,我优化了Process的调用代码之前担心cmd出问题,所以没有添加以下代码p.StandardInput.WriteLine("exit");现在添加了,就顺利结束了cmd进程,问题就顺利解决了 谢谢 晕,难怪会出现多个CMD了Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.StandardInput.Write("c:\\aaa.exe\r\n"); p.StandardInput.Write("exit\r\n"); p.WaitForExit(1000);//等待1秒,让cmd有时间去执行execute指令 因为后台执行CMD,很多情况会出现CMD交互的情况,例如 copy命令 很多时候要输入 /Y 之类的,后台又不知道,目前还没有想到好办法处理。究竟强制退出还是等待CMD结束呢矛盾。 WPF DoubleAnimation播放顺序 求一组数中的重复数? 部署项目的时候,怎么把数据库部署进去 如何在登陆成功后让登陆窗体不显示! keydown问题 [C#]如何将WinForm程序中的文本复制到剪切板? 类似反射的问题 怎样访问网络上的文件? 请高手进来.急!!!如何设置treeView1.Nodes[0].Nodes[0].IsVisible=false或者类似.Visible=false的功能 获取控件所有属性问题,请帮忙,急!!!!!!!! 问一个 程序提示 "应用程序正常初始化失败的问题 0xc000000007b" 问题 【【【【请问一个正则表达式的写法】】】】
对于windows服务,建议分开处理,更改如下:
1.windows服务不要设置”本地系统账户”,默认System最高权限即可,不需要在服务里做Process服务启动交互界面
2.在开始-启动菜单里添加交互界面启动,用户登陆即可启动程序
你说的先后问题,我也没有考虑进去,
因为我测试的时候,正常启动系统后,通过net start 和net stop 调用服务的,
这个时候explorer.exe已经存在了。目前情况是
如果不以System权限运行,无论服务停不停止都不会正常使用。
我觉得关键应该在于释放不释放的问题,怎么解释存在那么多个cmd进程呢
2.这个Process和Disponse没有关系,一旦Process启动CMD后,Process则会自动由GC处理回收,不会长期驻留内存,我觉得这个地方可能是你系统出现多个CMD进程的原因,如果你在P.Start后立刻判断交互界面是否启动,这样就会出现重复操作,CMD是一个进程指令,添加一个等待指令我觉得可以解决
Process p;
p.Start();
p.WaitForExit();
WaitForExit将会阻塞服务,直到CMD退出后才会继续执行
我代码是:Process p = new Process();
p.StandardInput.WriteLine(“c:\123.exe”);
StreamReader reader = p.StandardOutput;//CMD窗口返回的信息
p.StandardOutput.Close();
p.StandardError.Close();
p.Close();
reader.Close();应该不存在WaitForExit将会阻塞服务吧?已经直接close掉了
你提了一下我,我优化了
Process的调用代码
之前担心cmd出问题,所以没有添加以下代码
p.StandardInput.WriteLine("exit");现在添加了,就顺利结束了cmd进程,问题就顺利解决了 谢谢
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardInput.Write("c:\\aaa.exe\r\n");
p.StandardInput.Write("exit\r\n");
p.WaitForExit(1000);//等待1秒,让cmd有时间去执行execute指令
例如 copy命令 很多时候要输入 /Y 之类的,
后台又不知道,目前还没有想到好办法处理。
究竟强制退出还是等待CMD结束呢
矛盾。