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. 已经为类型参数“Chart”指定了 constraint 子句。必须在单个 where 子句中指定类型参数的所有约束

    public abstract class FillWorkBook<TModel, Chart> where TModel : struct where Chart : new() wh ...

  2. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  3. 实例快速上手 -ASP.NET 4.5新特性WebAPI从入门到精通

    在新出的MVC4中,增加了WebAPI,用于提供REST风格的WebService,新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models.Views.Controllers等文件夹和 ...

  4. 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容

    其实很简单,只要将容器控件中的附加属性FocusManager.IsFocusScope设为True就可以了 下面是个简单的用例: <Window x:Class="WpfApplic ...

  5. iOS----------使用 Xcode6或Xcode7配置.pch文件

    刚上手 Xcode6/Xcode7 的人,总会发现之前在 6 之前常常会在“利用名-Prefix.pch”这个文件中来配置我们全局要用到的头文件,但是 xcode6 没有了,人家说,这类东西有时候也会 ...

  6. javascript_basic_04之节点、元素

    1.DOM:文档对象模型,Document Object Model: 2.BOM:浏览器对象模型,Browser Object Model: 3.DOM组成:核心DOM,XML DOM,HTML D ...

  7. C# string.format、string.connect和+=运算 效率计算

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Stri ...

  8. KendoUI系列:DropDownList

    1.基本使用 1>.创建Input <input id="dropDownList" /> <link href="@Url.Content(&q ...

  9. SQL Pass北京举办1周年活动(本次活动特别邀请到了来自微软的SQL Server大师何雷谈数据库职业规划)

    地点:北京微软(中国)有限公司[望京利星行],三层308室 时间:2013年 12 月28日 13:30-16:30 SQL PASS 北京QQ群号:2435349 新浪微群地址:http://q.w ...

  10. javascript中的错误处理机制

    × 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...