Fork me on GitHub

.NET 4 System.Threading.CountdownEvent

Visual Studio 2010 and .NET Framework 4 Training Kit中有个System.Threading.CountdownEvent的Demo, CountdownEvent类似于Java中有个 CountDownLatch类, 通过CountdownEvent可以在主线程中线程池中的任务运行,主线程要等待线程池中的任务完成之后才能继续。CountdownEvent Class在使用上十分的简单,只要在CountdownEvent的构造函数中传入信号量的数量。在每个线程启动的地方主线程调用AddCount方法增加信号量计数,线程池中跑的线程调用Signal。然后在主线程中调用Signal和Wait方法,就可以实现主 线程等待X次Signal方法调用之后继续。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace CountdownEventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var customers = Enumerable.Range(1, 20);

            using (var countdown = new CountdownEvent(1))
            {
                foreach (var customer in customers)
                {
                    int currentCustomer = customer;                   
                    ThreadPool.QueueUserWorkItem(delegate
                    {
                        BuySomeStuff(currentCustomer);
                        countdown.Signal();                      
                    });
                    countdown.AddCount();
                }

                countdown.Signal();
                countdown.Wait();
            }

            Console.WriteLine("All Customers finished shopping...");
            Console.ReadKey();
        }

        static void BuySomeStuff(int customer)
        {
            // Fake work
            Thread.SpinWait(200000000);

            Console.WriteLine("Customer {0} finished", customer);
        }
    }
}

相关文章:Fork/Join parallelism with .NET CountdownEvent

posted @ 2009-10-27 20:38  张善友  阅读(2432)  评论(4编辑  收藏  举报