none
一个循环过程中,我设置了多个线程并行运算;但需要在这个循环结束时,等待这些线程都执行完。我该怎么做? RRS feed

  • 问题

  • 一个循环过程中,我设置了多个线程并行运算;但需要在这个循环结束时,等待这些线程都执行完。我该怎么做?
    ......
                int page=0;
                do
                {
                    page++;
                    Filter_WebPage web1 = new Filter_WebPage();
                    web1.QueryUrl = baseUrl + "&page=" + page.ToString();
                    web1.Today = _today;
                    Thread collect_web1 = new Thread(new ThreadStart(web1.Run));
                    collect_web1.Start();

                    page++;
                    Filter_WebPage web2 = new Filter_WebPage();
                    web2.QueryUrl = baseUrl + "&page=" + page.ToString();
                    web2.Today = _today;
                    Thread collect_web2 = new Thread(new ThreadStart(web2.Run));
                    collect_web2.Start();

                    page++;
                    Filter_WebPage web3 = new Filter_WebPage();
                    web3.QueryUrl = baseUrl + "&page=" + page.ToString();
                    web3.Today = _today;
                    Thread collect_web3 = new Thread(new ThreadStart(web3.Run));
                    collect_web3.Start();

                    page++;
                    Filter_WebPage web4 = new Filter_WebPage();
                    web4.QueryUrl = baseUrl + "&page=" + page.ToString();
                    web4.Today = _today;
                    Thread collect_web4 = new Thread(new ThreadStart(web4.Run));
                    collect_web4.Start();

                    // 本循环中,如何等待前4个线程执行完毕?

                    // 准备下一个循环
                     //退出机制暂忽略
                } while (true);
    ......

    2009年9月25日 7:03

答案

  • 请使用 AutoResetEvent 来实现此功能。在线程中设置 (Set),在主线程中等待 (WaitOne) 就可以了。


    Mark Zhou
    • 已标记为答案 OpenNovo 2009年9月25日 9:31
    2009年9月25日 7:06
  • 不是 Event,AutoResetEvent 和 ManualResetEvent 是两个线程同步的 WaitHandle,与事件无关。您需要知道一些线程/异步同步的一些基本知识。建议您先参考 MSDN 上对于 AutoResetEvent 的描述。

    是的,主线程是程序的主入口点被执行的那个线程,也就是您的程序。
    Mark Zhou
    • 已标记为答案 OpenNovo 2009年9月25日 9:31
    2009年9月25日 7:35

全部回复

  • 请使用 AutoResetEvent 来实现此功能。在线程中设置 (Set),在主线程中等待 (WaitOne) 就可以了。


    Mark Zhou
    • 已标记为答案 OpenNovo 2009年9月25日 9:31
    2009年9月25日 7:06
  • Event?我还不知道怎么在代码里新建事件呢!另外,主线程是指我的这段代码对吗?
    2009年9月25日 7:14
  • 不是 Event,AutoResetEvent 和 ManualResetEvent 是两个线程同步的 WaitHandle,与事件无关。您需要知道一些线程/异步同步的一些基本知识。建议您先参考 MSDN 上对于 AutoResetEvent 的描述。

    是的,主线程是程序的主入口点被执行的那个线程,也就是您的程序。
    Mark Zhou
    • 已标记为答案 OpenNovo 2009年9月25日 9:31
    2009年9月25日 7:35