加载中…
个人资料
秋荷雨翔
秋荷雨翔
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,192
  • 关注人气:11
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#等待所有子线程执行结束

(2013-09-13 22:31:04)
标签:

c

主线程

子线程

等待

结束

分类: .NET

应用场景:假设有100条数据需要处理,很费时间,为了处理得更快,每次开起十个线程“同时”处理数据,等这十个线程结束后,再开起十个线程处理数据,直到数据全部处理完成。WaitHandle.WaitAll最多只支持64个线程,这里为了测试,假设最多只支持5个线程,所以一个ManualResetEvent列表不够用,这里使用的是ManualResetEvent列表的数组。这样,理论上可以将处理数据的时间缩短至大约十分之一。(我的猜想,不一定对,有问题请留言)

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Data;

 

namespace test002

{

    class Program

    {

 

        static void Main(string[] args)

        {

            Thread thread = new Thread(new ThreadStart(delegate()

            {

                int dataCount = 100;

                List<ManualResetEvent>[] mreListArray = new List<ManualResetEvent>[2];

                for (int k = 0; k < mreListArray.Length; k++)

                {

                    mreListArray[k] = new List<ManualResetEvent>();

                }

 

                DataTable dt = new DataTable("TableName");

                int i = 0;

 

                while (i < dataCount)

                {

                    for (int k = 0; k < mreListArray.Length; k++)

                    {

                        i++;

                        if (i > dataCount) goto pos;

                        dt = new DataTable("TableName");

 

                        ManualResetEvent mre = new ManualResetEvent(false);

                        mreListArray[k].Add(mre);

                        Param pra = new Param();

                        pra.mrEvent = mre;

                        pra.path = "path";

                        pra.dt = dt;

                        pra.i = i;

                        ThreadPool.QueueUserWorkItem(ThreadMethod, pra);

 

                        if (mreListArray[mreListArray.Length - 1].Count == 5)

                        {

                            WaitHandle.WaitAll(mreListArray[k].ToArray());

                            mreListArray[k] = new List<ManualResetEvent>();

                        }

                    }

                }

 

            pos:

                for (int k = 0; k < mreListArray.Length; k++)

                {

                    if (mreListArray[k].Count > 0)

                    {

                        WaitHandle.WaitAll(mreListArray[k].ToArray());

                    }

                }

 

                Console.WriteLine("Thread Finished!");

            }));

            thread.Start();

            Console.Read();

        }

 

        private static void ThreadMethod(object obj)

        {

            Param pra = (Param)obj;

            Console.WriteLine("Thread execute at {0}", pra.i);

            Thread.Sleep(100000);

            pra.mrEvent.Set();

        }

    }

 

    public class Param

    {

        public ManualResetEvent mrEvent;

        public DataTable dt;

        public string path;

        public int i;

    }

}

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有