管道技术一般采用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();
为了不阻塞主线程,可以将整个过程放到一个另一个线程里就可以了
新闻热点
疑难解答