回到正题,之前C#调用cmd,读取GDAL输出的结果,一直好好的。直到今天,从GDB导出的一个shp,用cmd调用,死活读不出来,当程序走到 Process.WaitForExit();就不动了(假死),查了一下,好多人都遇到了这问题,试了各种回答,都没用。最后查看官网文档,终于找到了解决方案,贴一下教程 地址


    其实关于线程假死的,微软官方给出了两种解决办法,我们依次来看。


calling p.StandardError.ReadToEnd before p.WaitForExit

     在调用 p.WaitForExit之前调用 p.WaitForExit,这种方式是同步读取,注意下图中红色框线内的调用顺序。



Process设置进程数 process进程停止运行_cmd


 



2. 
   performing asynchronous read operations on the StandardError stream


   用异步的方式去读取 StandardError , 同样的,注意下图中用红色框线框起来的内容。



Process设置进程数 process进程停止运行_线程假死_02


 



    第二种方式下面给出了一段说明,我们来看下:


Process设置进程数 process进程停止运行_cmd_03


     什么意思呢?意思就是你不能一会儿同步读取,一会儿异步读取,你开始采用的是同步读取,你后面就要一直使用同步读取。你开始使用的是异步读取,你后面就要一直使用异步读取。混合着用就容易出现假死的状态。



     总结:现在我们网络上能看到关于这个问题的各种回答,但是大都没有回到本质上来,其实就是犯了上面说的这个错误。 值得注意的是,上面的第一种解决方案,只能读取cmd的输出,不能读取cmd的输入。第二种方式输入和输出都可以读取。好了,本次教程就分享到这里,我们下次再会。