C#调用cmd出现Process线程假死或阻塞现象的官方解决方案

    引言:今天好郁闷啊,把手机给摔了,问了一下官网维修点,得花500大洋,我这是造的什么孽啊啊啊啊啊啊啊。。。。。。。。。。。。。。
     回到正题,之前C#调用cmd,读取GDAL输出的结果,一直好好的。直到今天,从GDB导出的一个shp,用cmd调用,死活读不出来,当程序走到 Process.WaitForExit();就不动了(假死),查了一下,好多人都遇到了这问题,试了各种回答,都没用。最后查看官网文档,终于找到了解决方案,贴一下教程 地址
    其实关于线程假死的,微软官方给出了两种解决办法,我们依次来看。
    1.   calling p.StandardError.ReadToEnd before p.WaitForExit
     在调用 p.WaitForExit之前调用 p.WaitForExit,这种方式是同步读取,注意下图中红色框线内的调用顺序。
C#调用cmd出现Process线程假死或阻塞现象的官方解决方案
 
   2.  performing asynchronous read operations on the StandardError stream
   用异步的方式去读取 StandardError , 同样的,注意下图中用红色框线框起来的内容。
C#调用cmd出现Process线程假死或阻塞现象的官方解决方案
 
    第二种方式下面给出了一段说明,我们来看下:
C#调用cmd出现Process线程假死或阻塞现象的官方解决方案
     什么意思呢?意思就是你不能一会儿同步读取,一会儿异步读取,你开始采用的是同步读取,你后面就要一直使用同步读取。你开始使用的是异步读取,你后面就要一直使用异步读取。混合着用就容易出现假死的状态。
  
     总结:现在我们网络上能看到关于这个问题的各种回答,但是大都没有回到本质上来,其实就是犯了上面说的这个错误。 值得注意的是,上面的第一种解决方案,只能读取cmd的输出,不能读取cmd的输入。第二种方式输入和输出都可以读取。好了,本次教程就分享到这里,我们下次再会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGIS.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值