- 15
- 0
- 约2.98千字
- 约 2页
- 2024-03-20 发布于上海
- 举报
C#创建Process调⽤外部程序卡死的原因分析和解决⽅案
最近做项⽬发现创建Prcess调⽤外部程序时,当处理的数据量变⼤后,Prcess⽆法退出,主程序卡死。
原代码:
Using(Processprocess=newProcess())
{
process.StartInfo=newProcessStartInfo(executablePathargs);
if(workingFolder!=null)
{
process.StartInfo.WorkingDirectory=workingFolder;
}
process.StartInfo.CreateNoWindow=true;
process.StartInfo.UseShellExecute=false;
process.StartInfo.RedirectStandardOutput=true;
process.StartInfo.RedirectStandardError=true;
DateTimestart=DateTime.Now;
process.Start();
process.WaitForExit();
DateTimefinish=DateTime.Now;
stringprocessOutput=process.StandardError.ReadToEnd()+
process.StandardOutput.ReadToEnd();
}
这段代码的作⽤是调⽤⼀个外部程序向⼀个服务器上传⼀串数据,原来数据⼤⼩是128bit,现在是4Kbit。
尝试了各种⽅式,在⽹上搜集各类资料,查找可能卡顿的地⽅,本来以为是调⽤的外部程序的问题,最后发现是主程序的问题。
原因分析:
1.使⽤同步⽅式读取执⾏结,在StandardOutput.ReadTEnd之前调⽤了WaitfrExit,导致死锁。
原代码使⽤了同步读取执⾏结的⽅式,在StandardOutput.ReadTEnd之前调⽤了WaitfrExit。当调⽤⽅从⼦进程的重定向流中进⾏
读取时,它依赖于⼦进程。调⽤⽅等待读取操作,直到⼦级写⼊流或关闭流为⽌。当⼦进程写⼊⾜够的数据以填充其重定向流时,它依赖
于⽗进程。⼦进程将在下⼀次写⼊操作之前等待,直到⽗进程从整个流中读取或关闭流为⽌。当调⽤⽅和⼦进程等待彼此完成操作时,会
发⽣死锁条件,并且这两个情况都⽆法继续。
简单点说就是当数据量较⼤时,⼦进程写⼊的数据占满了重定向流,此时⼦进程会停⽌写⼊,等待⽗进程从流读取数据,然⽽⽗进程会等待
直到⼦进程完成写⼊流,此时⽗进程⼦进程相互等待,程序陷⼊死锁。
正确的⽅法应该是在WaitFrExit之前调⽤StandardOutput.ReadTEnd。
原代码⽗进程在调⽤StandardOutput.ReadTEnd之前调⽤WaitfrExit,并且⼦进程写⼊⾜够多的⽂本以填充重定向的流,则会导致死
锁情况。⽗进程会⽆限期地等待⼦进程退出。⼦进程会⽆限期地等待⽗进程从整个流中读取StandardOutput。
2.同时调⽤StandardErrr.ReadTEnd和StandardOutput.ReadTEnd.
和上⾯的原因同理,如⽗进程调⽤StandardOutput.ReadTEnd后跟StandardErrr.ReadTEnd,并且⼦进程写⼊⾜够的⽂本来填
充其错误流,则会导致死锁情况。⽗进程会⽆限期地等待⼦进程关闭其StandardOutput流。⼦进程会⽆限期地等待⽗进程从整个流中读
取StandardErrr。
解决⽅案:
使⽤异步⽅式读取执⾏结和错误信息,同时加⼊延时检查。
⽰例代码为异步读取数据的⽅法:
using(Processprocess=newProcess())
{
StringBuilderprocessOutputBuilder=newStringBuilder();
process.StartInfo=newProcessStartInfo(executablePathargs);
if(workingFolder!=nu
您可能关注的文档
- 家具产业数字化转型与智能制造.pdf
- Unit6TravellingaroundAsiaReading素材-牛津深圳版(广州沈阳通用)七年级英语上册备课资源(课文翻译+思维导图+课文解析+配套习题+单词短语).pdf
- 公司完善薪酬分配制度实施方案.pdf
- 中小学升旗仪式流程和准备资料注意事项.pdf
- 2015年春季高考本科招生计划分学校、分专业安排情况1.pdf
- (完整word版)产品供货方案.pdf
- 八年级上册数学课本习题习题与讲解.pdf
- (七年级历史教案)七年级下册活动课一《历史短剧──文成公主入藏》.pdf
- 七年级上册英语作文_9篇.pdf
- (人教版)小学六年级数学上册公开课《用百分数解决问题(2)》优质课教学详案(附教学提示及教学反思).pdf
最近下载
- 哈弗H6国潮版汽车使用手册说明书pdf电子版下载.pdf
- 2023北京朝阳初三一模物理试卷含答案.pdf VIP
- 廉洁的好处与如何做.doc VIP
- SIEMENS-AXIOM Artis中文操作手册.pdf VIP
- 新常态下企业顶层设计.ppt VIP
- 中国青瓷艺术鉴赏知到智慧树期末考试答案题库2025年丽水学院.docx VIP
- 2026年春季学期主题班会安排表.docx
- 5年(2021-2025)北京中考物理真题分类汇编:专题08 压强(解析版).docx VIP
- 三年级下册英语 (外研版) 全册考点梳理 + 综合练习 (附答案).docx VIP
- 2020人工智能赋能先进制造行业研究报告.docx
原创力文档

文档评论(0)