PS:又见到熟悉的C#代码了,好开心,哈哈哈。这次又跳坑了,好不容易才爬起来。
 
公司有自己开发的一套Submit、Compile、Publish的生命周期系统。
在Compile时,需要调用外部的编译程序进行源代码的编译工作。
android的哥们最近换了打包的工具,从ant换成了gradle,于是需要系统支持gradle的编译。
gradle的配置、原理就不讲了,自行google就可以了。
 
写了一个带参数的批处理,来调用gradle进行编译打包。然后在C#中使用process进行关联调用。
在由于这个是后台调用,而且需要拿到编译的output和error,当然需要进行output和error的重定向。
(在查找批处理问题时,可以先放弃重定向,让结果直接输出在控制台中)
这时,出现了一个很令人费解的问题,关联调用的批处理,被莫名的阻塞掉了。在process等待超时,继续执行之后,批处理才会继续执行。
 
调试时发现一个情况,在超时之后,读取输出信息时,访问standoutput属性,会有一个类似溢出的报错信息。
于是google了输出重定向的相关知识,才发现批处理阻塞,正是跟这个报错有关。
先说下个人对于输出重定向的理解。
如果process设置了输出重定向,会设置一个输出的缓冲区,将process关联的程序输出结果写入缓冲区。
process通过不断的读取缓冲区的内容,来清空缓冲区。
缓冲区的空间是有限的,如果process没有进行数据读取,那么在某一时刻,缓冲区会被填满。
然后,关联进程会等待缓冲区的数据清空,而此时process在等待关联进程结束。于是,死锁发生了
 
解决方法:
在启动process后,进行输出缓冲区的读取操作
由于读取方法内部会一直阻塞至关联进程结束。为了保证主线程不被阻塞,一般是使用线程异步读取缓冲区的内容。
注意:线程的启动,要在Start方法之后,WaitForExit方法之前。
 
另:会进行输出的重定向有两个,output和error,两个都有类似问题,请保证处理完全。

C#使用Process调用批处理阻塞问题的更多相关文章

  1. nodejs直接调用grunt(非调用批处理)

    在windows下,我们做js构建工作,都习惯安装grunt-cli,只需要命令行grunt...一切构建工作都自动完成了.这已经是很完美的情况了,不过最近要做一个服务器版的自动化构建系统,在node ...

  2. C#修改系统环境变量,调用批处理bat

    一.设置环境变量 public void SetPath(string pathValue) { string pathlist; pathlist = Environment.GetEnvironm ...

  3. java: Runtime和Process调用本机程序

    java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...

  4. IIS调用批处理权限的处理[转]

    最近公司希望将Windows 2003升级为Windows 2008,做完安全设置后发现.net调用批处理拒绝访问的情况.网上很多说更改应用程序池的权限,建议不需要修改该权限,我这里强烈建议使用默认的 ...

  5. Java借助Runtime调用外部程序阻塞的代码

    有时候在java代码中会调用一些外部程序,比如SwfTools来转换swf.ffmpeg来转换视频等.如果你的代码这样写:Runtime.getRuntime().exec(command),会发现程 ...

  6. C#Process执行批处理后如何获取返回值?

    代码如下   p.StartInfo = new System.Diagnostics.ProcessStartInfo(path, pwd); p.Start();其中path是个BAT的路径!我想 ...

  7. C# 使用Process调用外部程序中所遇到的参数问题

    在使用Process.Start 调用外部程序时,除了程序的地址之外,是可以传递参数的,Process.Start 也有多个重载: // // 摘要: // 启动由包含进程启动信息(例如,要启动的进程 ...

  8. Java-JDBC调用批处理、存储过程、事务

    一.使用Batch批量处理数据库  当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.; 1.实现批处理有两种方式,第一种方式: S ...

  9. process调用protothread机制的相关宏定义——用HelloWorld进程诠释

    一.HelloWorld例子 #include "contiki.h" #include <stdio.h> /* For printf() */ /*-------- ...

随机推荐

  1. Atitti 跨语言异常的转换抛出 java js

    Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...

  2. Atitit jsr规范化分类 attilax总结

    Atitit jsr规范化分类 attilax总结 按照技术类别可以分成以下几类:1.Java EE (39 JSRs) --- J2EE平台规范 2.Java SE (42 JSRs) --- J2 ...

  3. Gridview转发

    首页 开源项目 问答 动弹 博客 翻译 资讯 专题 城市圈 [ 登录 | 注册 ] 博客专区 > Reya滴水心的博客详情 Asp.net中GridView使用详解(很全,很经典) Reya滴水 ...

  4. javascript_core_06之正则、Math、Date

    1.RegExp:Regular Expression,创建封装正则表达式: ①正则直接量:var reg=/reg/ig:②var reg=new RegExp(“reg”,“ig”): 2.Reg ...

  5. ngOptions

    ngOptions select as select as label for value in array <select ng-model="myColor" ng-op ...

  6. SQL Pass北京举办第11次线下活动,欢迎报名(本次活动特别邀请了来自微软总部Xin Jin博士)

    活动主题: 探讨SQL Server 2014与Fusion IO在SQL Server中的应用 地点:北京微软(中国)有限公司[望京利星行],三层308室 时间:2013年 10 月19日 13:3 ...

  7. javascript类型系统——字符串String类型

    × 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串S ...

  8. mysql数据库移植

    在mysql数据库移植的时候,把自己电脑上mysql中data目录的一些重要文件复制到其他电脑上,先备份一下其他电脑上的mysql的data目录,然后替换! 例如我的mysql默认的数据库文件位置:  ...

  9. spring源码分析之spring注解@Aspect是如何工作的?

    1.@Aspect 在xml定义:<aop:aspectj-autoproxy />,其定义在http://www.springframework.org/schema/aop/sprin ...

  10. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...