管道技術一般采用window api來實現(xiàn),最近我試著用c#來實現(xiàn)windows管道技術,發(fā)現(xiàn)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();
然后設置線程連續(xù)讀取輸出的字符串: 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 );
線程函數(shù)如下: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的回顯使得整個顯示區(qū)域閃爍m_txtoutput.appendtext( strline + "/r/n" );
m_txtoutput.selectionstart = m_txtoutput.text.length;
m_txtoutput.scrolltocaret();
為了不阻塞主線程,可以將整個過程放到一個另一個線程里就可以了
新聞熱點
疑難解答