各位英雄:
 
        关键字:(backgroundworker, process, StreamReader)        最近做一个C#项目,遇到一个问题,很棘手,望高手指教下~
        背景:  使用BackGroundWorker组件,在它的DoWork事件里,启动了一个Process(不是线程)。         问题:  Process里有一段使用Read()阻塞读取的操作(也可能是EndOfStream方法),导致程序一直阻塞在这里               (即使关闭调用的进程也一样),而BackGroundWorker自身也没有提供直接结束自己调用的方法(有?不是那
 
                个CancelAsync挂起)。        求方法:怎样直接关闭BackGroundWorker的调用(就是使他的IsBusy属性为false),或者怎样强制退出那个Read                
      
               ()阻塞?
求助~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   

解决方案 »

  1.   

    新建一个线程去启动一个Process
      

  2.   

    backgroundWorker1.CancelAsync() 用于取消异步执行
    backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度
    backgroundWorker1.RunWorkerAsync():用于开始执行异步操作
    backgroundWorker1.IsBusy 后台是否会执行
    backgroundWorker1.WorkerReportsProgress 声明异步执行时是否可以报告进度
    backgroundWorker1.WorkerSupportsCancellation 声明是否可以异步取消
    backgroundWorker1.CancellationPending 是否取消异步执行参考
      

  3.   

    能不用线程做么?  C# winform 不会用线程啊
      

  4.   

    http://www.cnblogs.com/pricks/archive/2009/11/09/1599017.html
      

  5.   

    将整个streamReader的reader读取放在一个线程中,然后在需要终止的时候,终止这个线程!         thread.Abort()
      

  6.   


    这个StreamReader不一样吧、、、
      

  7.   


    现在是用 C# BackGroundWork组件来代替 线程,   但这个东西没有类似于thread.Abort()的方法。
      

  8.   

    启动Process之后阻塞了调用线程,可能是因为你调用了
    Process.WaitForExit()方法,该方法会阻塞调用线程一直等待启动的进程执行结束.
    去掉这个方法的调用,如果要结束掉Process,可以用Kill()方法.
      

  9.   


    现在发生阻塞的位置是StreamReader的Read和EndOfStream 函数,即使关掉进程,还是阻塞在这里的读入流。
      

  10.   


    释放了也没用、、、还是阻塞、、强大的Read!
      

  11.   

    1.BackGroundWorker就是多线程...2.BackgroundWorker.CancelAsync方法就是中止后台线程...3.你的问题是你没有在RunWorkerCompleted事件中处理取消事件,关闭StreamReader...先把基本概念搞清楚...
      

  12.   

    1. 是的2. CancelAsync 只是置一个标志位,不做终止操作。3. Read阻塞发生在 DoWork调用的函数里,阻塞后怎么可能跑到RunWorkerCompleted里去还清楚不?