.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);
        }
    }
}

本文来自合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

时间: 2024-10-30 08:42:22

.NET 4 System.Threading.CountdownEvent的相关文章

项目中使用System.Threading.Timer对象时IIS释放Timer对象的问题

之前的一个项目中使用System.Threading.Timer对象时有没有遇到IIS释放Timer对象的问 题.说实话之前真没遇到过这个问题,就是说我之前定义的timer对象没有释放,运行正常, 回来后我就百度寻找这方面得信息,原来IIS在运行WebApp时对于非静态资源都是自动释放, 而我回头看了看之前写的Web程序,很幸运当时是这么写的: Global.asax文件 private static Timer time; //System.Threading; private static

【进程线程与同步】5.4 System.Threading.Interlocked 为多个线程共享的变量提供原子操作

using System; using System.Threading; internal class Program { private static long _counter = 1; private static void Main() { //下面程序显示两个线程如何并发访问一个名为counter的整形变量,一个线程让他递增5次,一个让他递减5次 Console.WriteLine("原始值:{0}", _counter); var t1 = new Thread(F1);

“System.Threading.ThreadAbortException”类型的异常在 mscorlib.dll 中发生

问题描述 "System.Threading.ThreadAbortException"类型的异常在mscorlib.dll中发生在用VS2005的时候建立站点,第一个界面能进入,但是点击注册进入第二个界面的时候就会出现上面的问题,不知道是哪里错了.输入用户名和密码登陆的时候会ConnectionString属性尚未初始化.连接有问题嘛?做的是一个基于ASP.NET的通讯录. 解决方案 解决方案二:我也遇到这样的情况,没有办法,唉!

timer-关于System.Threading.Timer

问题描述 关于System.Threading.Timer MSDN上的例子: using System; using System.Threading; public class Example { private static Timer ticker; public static void TimerMethod(object state) { Console.Write("."); } public static void Main() { ticker = new Timer

.NET 4 System.Threading.Barrier 类

在Visual Studio 2010 and .NET Framework 4 Training Kit中有个System.Threading.Barrier的Demo,通过Barrier Class我们可以控制线程的运行,做到线程同步的效果. Barrier Class在使用上十分的简单,只要在Barrier的构造函数中传入participantCount(简单的说就是要等待的线程个数),并在要同步的点调用SignalAndWait方法就可以了.线程会在调用SignalAndWait之后暂停

asp.net System.Threading.Timer 如何更新UI

问题描述 我要写一个通知提示,现在想把它做成个用户控件(ascx),用System.Threading.Timer定时去更新数据,更新数据重新绑定Repeater的时候,UI没有更新,GOOGLE了一把没找到答案,都是讲的winform,只好来这里问问,希望大家能解答,用的是System.Threading.Timer,不是微软那个控件,我也知道那个控件可以. 解决方案 解决方案二:能访问到UI吗,如果能访问就有办法更新呀解决方案三:哎,,,这不可能的.Web应用不搞点手段怎么能直接"推&quo

在 System.Threading.ThreadAbortException 中第一次偶然出现的“System.dll”类型的异常

问题描述 在System.Threading.ThreadAbortException中第一次偶然出现的"System.dll"类型的异常线程'<无名称>'(0x9bc)已退出,返回值为0(0x0).线程'<无名称>'(0x138)已退出,返回值为0(0x0).线程'<无名称>'(0xc90)已退出,返回值为0(0x0).线程'<无名称>'(0xa08)已退出,返回值为0(0x0). 解决方案 解决方案二:该回复于2011-11-25 1

在 System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常

问题描述 winform代码中使用Thread.Abort终止线程遇到以下错误.在System.Threading.ThreadAbortException中第一次偶然出现的"mscorlib.dll"类型的异常.请各位大神帮忙解决以下 解决方案 解决方案二:不会看MSDN吗?Thread.Abort方法.NETFramework4其他版本1(共1)对本文的评价是有帮助-评价此主题在调用此方法的线程上引发ThreadAbortException,以开始终止此线程的过程.调用此方法通常会

注解:System.Threading.Timer

   System.Threading.Timer 是一个非常常用的定时器类,关于这个类的使用,我们需要注意以下几点:    1.System.Threading.Timer 的任何一个实例,实际上是通过使用win32底层(非.NET Thread Pool中的线程)来进行调度的.    2.当到达调度时刻时,System.Threading.Timer 将异步调用由TimerCallback参数指定的回调方法.也就是说TimerCallback所指向的方法将在.NET Thread Pool中