首页 > 开发 > 综合 > 正文

C#实现Window管道技术

2024-07-21 02:18:06
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 之前发了一篇使用window api来实现管道技术的文章,后来改用c#来实现相同的效果,发现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();

    为了不阻塞主线程,可以将整个过程放到一个另一个线程里就可以了


    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表