管道技术一般采用window api来实现,最近我试着用c#来实现windows管道技术,发现c#本身方便的进程线程机制使工作变得简单至极,随手记录一下,推荐给大家。
首先,我们可以通过设置process类,获取输出接口,代码如下:
process proc = new process();
proc .startinfo.filename = strscript;
proc .startinfo.workingdirectory = strdirectory;
proc .startinfo.createnowindow = true;
proc .startinfo.useshellexecute = false;
proc .startinfo.redirectstandardoutput = true;
proc .start();
然后设置线程连续读取输出的字符串: eventoutput = new autoresetevent(false);
autoresetevent[] events = new autoresetevent[1];
events[0] = m_eventoutput;
m_threadoutput = new thread( new threadstart( displayoutput ) );
m_threadoutput.start();
waithandle.waitall( events );
线程函数如下:private void displayoutput()
{
while ( m_procscript != null && !m_procscript.hasexited )
{
string strline = null;
while ( ( strline = m_procscript.standardoutput.readline() ) != null)
{
m_txtoutput.appendtext( strline + "\r\n" );
m_txtoutput.selectionstart = m_txtoutput.text.length;
m_txtoutput.scrolltocaret();
}
thread.sleep( 100 );
}
m_eventoutput.set();
}
这里要注意的是,使用以下语句使textbox显示的总是最新添加的,而appendtext而不使用+=,是因为+=会造成整个textbox的回显使得整个显示区域闪烁m_txtoutput.appendtext( strline + "\r\n" );
m_txtoutput.selectionstart = m_txtoutput.text.length;
m_txtoutput.scrolltocaret();
为了不阻塞主线程,可以将整个过程放到一个另一个线程里就可以了
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器