C#浅析并行任务同步机制——Events 之 ManualResetEvent类

一、ManualResetEvent类

      命名空间:System.Threading

ManualResetEvent类的继承结构,事件是一个系统范围内的资源同步方法。为了从托管代码中使用系统事件,.Net FrameWorkd在System.Threading中定义了ManualResetEvent事件。

可以使用事件通知其他任务:这里有一些数据,并完成了一些操作。事件可以发出信号,也可以不发出信号。

Event 同步事件的一个特点:多个同步任务可以交叉运行。线程A、B同时运行,下面的图例说明运行方式

上面标有数字的,是程序运行的顺序。代码如下,例子可能不太贴切,为了

 class Program
    {
        static ManualResetEvent manA;
        static ManualResetEvent manB;
        static void Main(string[] args)
        {
            manA = new ManualResetEvent(false);
            manB = new ManualResetEvent(false);

            Manager Man = new Manager("大堂经理");

            Worker worker1 = new Worker("Mike");
            worker1.accheck += Man.Check;
            Worker worker2 = new Worker("Tom");
            worker2.accheck += Man.Check;

            Random ran = new Random();

            Action ac1 = () =>
            {
                worker1.EditBill();
                manB.Set();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                manA.WaitOne();
                worker1.ReCheck();
                manB.Set();
                manA.WaitOne();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                worker1.CustomeConfirm();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                manB.Set();
                manA.WaitOne();
                worker1.ReCheck();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                worker1.Complete();
            };

            Action ac2 = () =>
            {
                worker2.EditBill();
                manA.Set();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                manB.WaitOne();
                worker2.ReCheck();
                manA.Set();
                manB.WaitOne();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                worker2.CustomeConfirm();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                manB.Set();
                manA.WaitOne();
                worker2.ReCheck();
                Thread.Sleep(ran.Next(1, 10) * 1000);
                worker2.Complete();
            };

            Parallel.Invoke(ac1, ac2);
            ReadLine();
        }
    }

    public class Person
    {
        private string _name;
        public Person(string name)
        {
            this._name = name;
        }
        public string Name { get { return this._name; } }
    }

    /// <summary>
    /// 经理
    /// </summary>
    public class Manager:Person
    {
        public Manager(string name) : base(name)
        {
        }
     
        /// <summary>
        /// 审核的方法
        /// </summary>
        public void Check()
        {
            WriteLine($"{this.Name} 正在审核信息。。。");
        }
    }
    /// <summary>
    /// 员工
    /// </summary>
    public class Worker : Person
    {
        public Worker(string name) : base(name)
        {

        }
        /// <summary>
        /// 工作第一步
        /// </summary>
        public void EditBill()
        {
            WriteLine($"{this.Name} 填写单据");
        }


        public event Action accheck;
        /// <summary>
        /// 请求审核
        /// </summary>
        public void ReCheck()
        {
            WriteLine($"{this.Name} 请求审核");
            if (accheck != null)
                accheck();
        }
        /// <summary>
        /// 工作第三步
        /// </summary>
        public void CustomeConfirm()
        {
            WriteLine($"{this.Name} 请求客户确认");
        }
        /// <summary>
        /// 工作最后一步
        /// </summary>
        public void Complete()
        {
            WriteLine($"{this.Name} 完成当前任务");
        }
    }

为了加深自己的印象,特留做印记。如有高见,请不吝赐教。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fervour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值