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. js中setTimeout()的使用bug

    今天用setTimeout()时,遇到一个奇怪的现象,通过多方面的查询,最终解决了问题,这是setTimeout()设计的时候存在的一点点bug. 代码的作用主要是在三秒后自动关闭本浏览器窗口: 代码 ...

  2. Java程序员的日常——存储过程知识普及

    存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器, ...

  3. lua使用io.open跨平台文件夹遍历匹配查找

    -- Desc :实现在LUA_PATH中的lua文件中遍历寻找没用到PNG_PATH路径下的png图片,并将其打印出来. -- Date :12:49:28 2014-09-04 1 print(& ...

  4. Paip.语义分析----情绪情感词汇表总结

    Paip.语义分析----情绪情感词汇表总结 以下词语是按感情色彩共分为十四类: 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:h ...

  5. java学习笔记--this 关键字的理解

    彻底理解this 关键字的含义 this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄. 怎么理解这段话呢 ...

  6. C#学习系列-类与结构的区别

    参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9830&ct=31038 如 ...

  7. easyui combotree下拉框多选赋值

    发现jquery.easyui.min.js 1.3.4版本的用setValues给多选下拉框赋值不成功,只能用1.3.1版本的 Html代码: <input id="ProductL ...

  8. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  9. dubbox

    github源码: https://github.com/dangdangdotcom/dubbox maven中央仓: 无 获取分支 git clone -b dubbox-2.8.4 https: ...

  10. Android_文件存储

    因为项目的需求,想实现一个指导使用的欢迎页效果,通过在网上的询问,给的一种解决办法是通过SharedPreferences文件存储方式来实现,具体的实现类似于通过第一次取得SharedPreferen ...