我想知道是方法还是事件呢?
首先如果像我这么写的话 fenxi(data)就不会停住
会在线程下载的时候直接就运行了

解决方案 »

  1.   

    ManualResetEvent wait = new ManualResetEvent(false);
    Main()
    {
        wait.WaitOne();
    }void Run()
    {.....
     wait.Set();
    }
      

  2.   

    这个怎么会可以呢?WaitOne()一直要等到Set()之后才会继续下面的操作,等于被阻塞。
    应该用异步来实现。最简单的是winform里的backgroundworker,在Completed事件中可进行fenxi(data);
      

  3.   

    确实啊我发现了程序UI卡死了
    怎么办呢?
    我做的WPF 是不是也有backgrounder
      

  4.   

    应该可用,参考:http://www.ryanvice.net/wpf-3-5/using-backgroundworker-with-wpf/
      

  5.   


    这是.net框架基本组件,在各种子平台下都有backgroundworker。假设你使用WaitHandler阻塞,那么你应该首先启动一个线程,这个线程再去分别启动两个download线程,并阻塞。而不能在主线程中有任何阻塞代码。假设你精简地、不用任何阻塞,那么应该在两个download线程中每一个调用方法的最后,会掉一个fenxi方法。然后这个分析方法首先判断是否下载结束,例如lock(downloadList)
    {
        downloadList.Remove(thisMethodFlag);
        if(downloadList.count==0)
            真正开始分析();
    }
    每一个download过程再结束时都去调用fenxi方法判断是否“下载任务集合”已经为空,如果不为空,就什么也不做;只有为空,才开始真正去分析。这样,不需要占用一个线程的资源去搞阻塞,
      

  6.   

    不要纠结于“继续主线程”这个词儿!你的fenxi方法不一定执行在哪一个线程中,完全可以使用某一个download所使用的线程。假设你之前的观念就是“一定要在主线程中执行”,那么就纠结了。实际上,任何计算工作都无需主线程去执行(当然无不是说就必须使用子线程)。如果你这样去设计程序,就可以选择最为恰当的流程。
      

  7.   

    其实我是在设计一个下载,然后下载完成以后让用户去选择是否继续,但是必须要等待下载完成才行。
    我下载用的是backgroundworker。有一个问题是  我的函数已经封装好了
    比如是:
            private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
                Search_Net sn = new Search_Net();
                Vars.name.Clear();
                Vars.link.Clear();
                sn.google(content);
            }
    其中sn.google是一个比较耗时的函数,比如google100个页面,每增加一个progressbar +1的话
    bw_ProgressChanged是不是就不好用了
    应该怎么实现呢?
      

  8.   

    是啊,我自己都乱了
    在线抓取数据,抓取时前台不死机,后台运行并有progrebar显示
    完成后给出提示,比如MessageBox.