.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之后暂停运行,等待所有参与的线程都到达了同步点才继续往下运行。

举个例子来看,假设今天Charlie、Mac、Dennis三个人相约要去西雅图喝咖啡。由于三个人的住的地区不尽相同,且车子都需要加油,因此他们约在途中会经过的加油站待会合后一同前往。这样的情境我们可以通过Thread与Barrier用程序仿真出来。

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

namespace BarrierDemo
{
    class Program
    {
        static Barrier sync;
        static CancellationToken token;

        static void Main(string[] args)
        {
            var source = new CancellationTokenSource();
            token = source.Token;
            sync = new Barrier(3);

            var charlie = new Thread(() => DriveToBoston("Charlie", TimeSpan.FromSeconds(1))); charlie.Start();
            var mac = new Thread(() => DriveToBoston("Mac", TimeSpan.FromSeconds(2))); mac.Start();
            var dennis = new Thread(() => DriveToBoston("Dennis", TimeSpan.FromSeconds(3))); dennis.Start();

            //source.Cancel();

            charlie.Join();
            mac.Join();
            dennis.Join();

            Console.ReadKey();
        }

        static void DriveToBoston(string name, TimeSpan timeToGasStation)
        {
            try
            {
                Console.WriteLine("[{0}] Leaving House", name);

                // Perform some work
                Thread.Sleep(timeToGasStation);
                Console.WriteLine("[{0}] Arrived at Gas Station", name);

                // Need to sync here
                sync.SignalAndWait(token);

                // Perform some more work
                Console.WriteLine("[{0}] Leaving for Boston", name);
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("[{0}] Caravan was cancelled! Going home!", name);
            }
        }
    }
}

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

时间: 2024-08-04 05:24:54

.NET 4 System.Threading.Barrier 类的相关文章

.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的构造函数中传入信号量的

注解:System.Threading.Timer

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

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

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

qq邮箱-【在线等】用system.net.mail类发送邮件,发现一个QQ邮箱账号成功,另一个失败,求解

问题描述 [在线等]用system.net.mail类发送邮件,发现一个QQ邮箱账号成功,另一个失败,求解 环境:VS 2010 ,SQL2005,WIN7系统.两个邮箱账号都是普通邮箱,都是用的英文邮箱名,都开启了SMTP服务.成功的那个邮箱以前也使用过,也是成功的.失败的那个邮箱运行时提示如图所示. 完整邮件操作代码我附在下面了,请高手解答啊!! public String sendRegEmail(string rec string topic string content) { Syst

【进程线程与同步】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

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