自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

描述C#調(diào)用外部進(jìn)程

開(kāi)發(fā) 后端
本文介紹C#調(diào)用外部進(jìn)程這么簡(jiǎn)單的一件事究竟會(huì)有哪些問(wèn)題,也希望我寫(xiě)的這個(gè)相對(duì)比較完整的類(lèi)可以為軟件開(kāi)發(fā)的同道們節(jié)約一些腦細(xì)胞,以便集中優(yōu)勢(shì)兵力解決那些真正高深復(fù)雜的軟件問(wèn)題。

C#調(diào)用外部進(jìn)程的類(lèi),網(wǎng)上可以搜出很多來(lái),為什么要再寫(xiě)一遍,實(shí)在是因?yàn)樽罱鼜木W(wǎng)上拷貝了一個(gè)簡(jiǎn)單的例程用到項(xiàng)目中,運(yùn)行有問(wèn)題,后來(lái)研究了半天,才解決了這些問(wèn)題。于是打算寫(xiě)這么一篇博文,一來(lái)說(shuō)說(shuō)C#調(diào)用外部進(jìn)程這么簡(jiǎn)單的一件事究竟會(huì)有哪些問(wèn)題,二來(lái)也希望我寫(xiě)的這個(gè)相對(duì)比較完整的類(lèi)可以為軟件開(kāi)發(fā)的同道們節(jié)約一些腦細(xì)胞,以便集中優(yōu)勢(shì)兵力解決那些真正高深復(fù)雜的軟件問(wèn)題。

在開(kāi)始正題之前,我們先來(lái)看一看網(wǎng)上比較常見(jiàn)的執(zhí)行外部進(jìn)程的函數(shù)

  1. privatestringRunCmd(stringcommand)  
  2. {  
  3. //例Process  
  4. Processp=newProcess();  
  5.  
  6. p.StartInfo.FileName="cmd.exe";//確定程序名  
  7. p.StartInfo.Arguments="/c"+command;//確定程式命令行  
  8. p.StartInfo.UseShellExecute=false;//Shell的使用  
  9. p.StartInfo.RedirectStandardInput=true;//重定向輸入  
  10. p.StartInfo.RedirectStandardOutput=true;//重定向輸出  
  11. p.StartInfo.RedirectStandardError=true;//重定向輸出錯(cuò)誤  
  12. p.StartInfo.CreateNoWindow=true;//設(shè)置置不顯示示窗口  
  13.  
  14. p.Start();//00  
  15.  
  16. //p.StandardInput.WriteLine(command);//也可以用這種方式輸入入要行的命令  
  17. //p.StandardInput.WriteLine("exit");//要得加上Exit要不然下一行程式  
  18.  
  19. returnp.StandardOutput.ReadToEnd();//輸出出流取得命令行結(jié)果果  
  20.  
  21. }  

這個(gè)方法應(yīng)該是比較常見(jiàn)的C#調(diào)用外部進(jìn)程的方法,我以前也一直是這樣調(diào)用外部進(jìn)程的,也沒(méi)有碰到過(guò)什么問(wèn)題。但這次調(diào)用的外部進(jìn)程比較特殊,用這種方法調(diào)用就出現(xiàn)了兩個(gè)問(wèn)題。

***個(gè)問(wèn)題是這個(gè)被調(diào)用的外部進(jìn)程有時(shí)候會(huì)出現(xiàn)異常,出現(xiàn)異常后Windows會(huì)彈出錯(cuò)誤報(bào)告框,程序于是吊死在那里,必須手工干預(yù)。這個(gè)問(wèn)題比較好解決,程序中設(shè)置一下注冊(cè)表搞定。

第二個(gè)問(wèn)題是C#調(diào)用外部進(jìn)程(是一個(gè)控制臺(tái)進(jìn)程)后,程序會(huì)阻塞在p.StandardOutput.ReadToEnd();這一句,永遠(yuǎn)無(wú)法出來(lái),被調(diào)用的那個(gè)控制臺(tái)程序也被吊死。但該控制臺(tái)進(jìn)程在CMD 中是可以正常執(zhí)行的。后來(lái)看來(lái)一些資料才發(fā)現(xiàn)原來(lái)原因是出在該控制臺(tái)程序控制臺(tái)輸出大量字符串,管道重定向后,調(diào)用程序沒(méi)有及時(shí)將管道中的輸出數(shù)據(jù)取出,結(jié)果導(dǎo)致管道被阻塞,程序吊死。在這里還有另外一個(gè)問(wèn)題,雖然這次沒(méi)有遇到,但網(wǎng)上有其他人遇到,就是錯(cuò)誤信息管道不及時(shí)取出數(shù)據(jù),也會(huì)被阻塞,而且如果要同時(shí)取出兩個(gè)管道的數(shù)據(jù),必須要利用一個(gè)輔助線程才能實(shí)現(xiàn)。

問(wèn)題講完了,下面給出這個(gè)類(lèi)的完整代碼

  1. usingSystem;  
  2. usingSystem.Collections.Generic;  
  3. usingSystem.Text;  
  4. usingSystem.Runtime.InteropServices;  
  5. usingSystem.Threading;  
  6.  
  7. namespaceLaboratory.Process  
  8. {  
  9. classReadErrorThread  
  10. {  
  11. System.Threading.Threadm_Thread;  
  12. System.Diagnostics.Processm_Process;  
  13. Stringm_Error;  
  14. boolm_HasExisted;  
  15. objectm_LockObj=newobject();  
  16.  
  17. publicStringError  
  18. {  
  19. get  
  20. {  
  21. returnm_Error;  
  22. }  
  23. }  
  24.  
  25. publicboolHasExisted  
  26. {  
  27. get  
  28. {  
  29. lock(m_LockObj)  
  30. {  
  31. returnm_HasExisted;  
  32. }  
  33. }  
  34.  
  35. set  
  36. {  
  37. lock(m_LockObj)  
  38. {  
  39. m_HasExisted=value;  
  40. }  
  41. }  
  42. }  
  43.  
  44. privatevoidReadError()  
  45. {  
  46. StringBuilderstrError=newStringBuilder();  
  47. while(!m_Process.HasExited)  
  48. {  
  49. strError.Append(m_Process.StandardError.ReadLine());  
  50. }  
  51.  
  52. strError.Append(m_Process.StandardError.ReadToEnd());  
  53.  
  54. m_Error=strError.ToString();  
  55. HasExisted=true;  
  56. }  
  57.  
  58. publicReadErrorThread(System.Diagnostics.Processp)  
  59. {  
  60. HasExisted=false;  
  61. m_Error="";  
  62. m_Process=p;  
  63. m_Thread=newThread(newThreadStart(ReadError));  
  64. m_Thread.Start();  
  65. }  
  66.  
  67. }  
  68.  
  69. classRunProcess  
  70. {  
  71. privateStringm_Error;  
  72. privateStringm_Output;  
  73.  
  74. publicStringError  
  75. {  
  76. get  
  77. {  
  78. returnm_Error;  
  79. }  
  80. }  
  81.  
  82. publicStringOutput  
  83. {  
  84. get  
  85. {  
  86. returnm_Output;  
  87. }  
  88. }  
  89.  
  90. publicboolHasError  
  91. {  
  92. get  
  93. {  
  94. returnm_Error!=""&&m_Error!=null;  
  95. }  
  96. }  
  97.  
  98. publicvoidRun(StringfileName,Stringpara)  
  99. {  
  100. StringBuilderoutputStr=newStringBuilder();  
  101.  
  102. try  
  103. {  
  104. //disabletheerrorreportdialog.  
  105. //reference:http://www.devcow.com/blogs/adnrg/archive/2006/07/14/
    Disable-Error-Reporting-Dialog-for-your-application-with-the-registry.aspx  
  106. Microsoft.Win32.RegistryKeykey;  
  107. key=Microsoft.Win32.Registry.LocalMachine.OpenSubKey
    (@"software\microsoft\PCHealth\ErrorReporting\",true);  
  108. intdoReport=(int)key.GetValue("DoReport");  
  109.  
  110. if(doReport!=0)  
  111. {  
  112. key.SetValue("DoReport",0);  
  113. }  
  114.  
  115. intshowUI=(int)key.GetValue("ShowUI");  
  116. if(showUI!=0)  
  117. {  
  118. key.SetValue("ShowUI",0);  
  119. }  
  120. }  
  121. catch  
  122. {  
  123. }  
  124.  
  125.  
  126. m_Error="";  
  127. m_Output="";  
  128. try  
  129. {  
  130. System.Diagnostics.Processp=newSystem.Diagnostics.Process();  
  131.  
  132. p.StartInfo.FileName=fileName;  
  133. p.StartInfo.Arguments=para;  
  134. p.StartInfo.UseShellExecute=false;  
  135. p.StartInfo.RedirectStandardInput=true;  
  136. p.StartInfo.RedirectStandardOutput=true;  
  137. p.StartInfo.RedirectStandardError=true;  
  138. p.StartInfo.CreateNoWindow=true;  
  139.  
  140. p.Start();  
  141.  
  142. ReadErrorThreadreadErrorThread=newReadErrorThread(p);  
  143.  
  144. while(!p.HasExited)  
  145. {  
  146. outputStr.Append(p.StandardOutput.ReadLine()+"\r\n");  
  147. }  
  148.  
  149. outputStr.Append(p.StandardOutput.ReadToEnd());  
  150.  
  151. while(!readErrorThread.HasExisted)  
  152. {  
  153. Thread.Sleep(1);  
  154. }  
  155.  
  156. m_Error=readErrorThread.Error;  
  157. m_Output=outputStr.ToString();  
  158. }  
  159. catch(Exceptione)  
  160. {  
  161. m_Error=e.Message;  
  162. }  
  163. }  
  164.  
  165. }  
  166. }  

【編輯推薦】

  1. 分析C#不安全代碼
  2. 淺析C#調(diào)用ImageAnimator
  3. C#連接Access、SQL Server數(shù)據(jù)庫(kù)
  4. 淺談C#固定的和活動(dòng)的變量
  5. 介紹C#中的值類(lèi)型
責(zé)任編輯:佚名 來(lái)源: 博客園
相關(guān)推薦

2009-08-07 17:19:50

C#調(diào)用外部進(jìn)程

2009-09-03 17:59:18

C#調(diào)用事件

2009-09-03 16:20:14

C#調(diào)用Windows

2009-08-13 17:04:09

C#語(yǔ)言C#程序

2009-08-31 18:32:01

C# ListBoxE

2009-08-03 18:08:39

C# ICloneab

2009-08-17 16:32:34

C# Anonymou

2009-08-18 17:41:22

C# ListView

2009-08-26 17:49:36

C# readonly

2009-08-31 13:18:09

C# IWebMess

2009-08-20 09:30:03

C#開(kāi)發(fā)WinForm

2009-08-03 16:45:02

C#異步Socket

2009-08-19 10:09:21

C#和C++

2024-05-27 00:20:00

2024-08-13 08:25:16

C#外部程序方式

2009-09-04 13:22:31

C#實(shí)現(xiàn)多個(gè)接口

2009-09-16 09:01:40

C#多維數(shù)組

2009-08-21 17:31:58

C#垃圾回收

2009-08-13 17:58:34

C#存儲(chǔ)過(guò)程

2009-08-28 09:30:48

C#命名屬性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)