今天遇到类似于这样子一种情况 
 public class Program
    {
        public IList<int> list = new List<int>();
        public void Method()
        {
            for (int i = 0; i < 1000; i++)
            {
                list.Add(i);
            }
        }        public void dosomething()
        {
            for (int i = 0; i < 1000; i++)
            {
                Thread thread = new Thread(Method);
                thread.Start();
            }
        }
        static void Main(string[] args)
        {
            Program p= new Program();
            p.dosomething();
            Console.WriteLine(p.list.Count);
            Console.Read();
                    }
    }
dosomething里面启动了1000个线程,在每个线程里面对list添加0-1000,然后,,每次Console.WriteLine(p.list.Count);
打印的值不一样。。
我想做的是只有当这1000个线程都执行完了,再执行Console.WriteLine(p.list.Count);
只要有一个线程没有执行完, Console.WriteLine(p.list.Count)就执行挂起。。

解决方案 »

  1.   


        int doneTasks = 0;                           //<--
        public void Method()
        {
            //...
            Interlocked.Increment(ref doneTasks);    //<--
        }
        static void Main(string[] args)
        {
            //...
            while (p.doneTasks < 1000) Thread.Sleep(500);  //<--
            Console.WriteLine(p.list.Count);
            Console.Read();
        }
      

  2.   

    给你个完整例子吧    class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 1000; i++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(TestMethod),i);
                }            manu.WaitOne();
                Console.WriteLine("finish");        }        static int methodNumber = 1000;
            static ManualResetEvent manu = new ManualResetEvent(false);        static void TestMethod(object state)
            {
                try
                {
                    Console.WriteLine(state);
                }
                finally
                {
                    if (Interlocked.Decrement(ref methodNumber) == 0)
                        manu.Set();
                }
            }
        }
      

  3.   

    3楼正解for (int i = 0; i < 1000; i++)
    {
      list.Add(i);
    }
    楼主这样添加数据有问题,没有同步,最后估计没有1000*1000数吧