• 线程同步-使用CountDownEvent类


    CountDownEvent类:信号类,等待直到一定数量的操作完成。

    代码Demo:

    using System;

    using System.Threading;

    Main方法下面加入以下代码片段:

     public CountdownEvent _countdown = new CountdownEvent(2);-----------1

    public void PersormOperation(string message, int seconds)
    {
    Thread.Sleep(TimeSpan.FromSeconds(seconds));
    Console.WriteLine(message);
    _countdown.Signal();
    }

    在Main方法中加入以下代码片段:

    Console.WriteLine("Starting two operations");
    var t1 = new Thread(() => PersormOperation("Operation 1 is completed", 4));
    var t2 = new Thread(() => PersormOperation("Operation 2 is completed", 8));
    t1.Start();
    t2.Start();

    _countdown.Wait();
    Console.WriteLine("Both operation have been completed.");
    _countdown.Dispose();

    工作原理:

    主线程启动,穿件一个CountdownEvent实例,在构造函数中制定了当两个操作完成时会发出信号(1行代码)。然后启动了两个线程,当他们执行完成后会发出信号。一旦第二个线程完成,主线程会从等待CountdownEvent的状态中返回并继续执行。针对需要等待多个一部操作完成的情形,使用该方式是非常便利的。

    注意:一个重大的缺点。如果调用_countdown.Signal()没有达到指定的次数,那么_countdown.Wait()将一直等待。请确保使用CountdownEvent 时,所有线程完成后都要调用Signal方法。(可以测试一下把1行代码,修改为3,这样我们只是启动了两个线程,永远达不到3个线程的数量,那么就一直处于等待状态。)

  • 相关阅读:
    济南学习 Day2 T1 am
    济南学习 Day1 T2 pm
    济南学习 Day1 T3 am
    济南学习 Day 1 T2 am
    洛谷 P1209 修理牛棚== Codevs 2079 修理牛棚
    2016.10.30 济南学习 Day2 下午 T1
    餐厅随笔----2016.10.30 于济南 外出学习
    bzoj1671 [Usaco2005 Dec]Knights of Ni 骑士
    bzoj1088 [SCOI2005]扫雷Mine
    bzoj1655 [Usaco2006 Jan] Dollar Dayz 奶牛商店
  • 原文地址:https://www.cnblogs.com/v-haoz/p/9260463.html
Copyright © 2020-2023  润新知