zoukankan      html  css  js  c++  java
  • C# 线程通信 一

    C#多线程通信

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6 using System.Threading.Tasks;
     7 
     8 namespace App.Test.Csharep.线程通信
     9 {
    10     public class MainThread
    11     {
    12         /// <summary>
    13         /// 开始执行通知
    14         /// </summary>
    15         private EventWaitHandle dataChangeEvent = new AutoResetEvent(false);
    16         
    17 
    18         public int openDoorNum = 0;
    19 
    20         /// <summary>
    21         /// 测试流程: 完成10次开门后,每次开门完成都要完成进门操作,主线程完成开门,子线程完成进门
    22         /// </summary>
    23         public void Run()
    24         {
    25             var thread = new Thread(new ThreadStart(InputDoor));
    26             thread.Name = "进门线程";
    27             thread.IsBackground = true;
    28             thread.Start();
    29 
    30             Thread.Sleep(500);
    31 
    32             for (int i = 0; i < 10; i++)
    33             {
    34                 openDoorNum++;
    35                 Console.WriteLine("AA完成开门第" + openDoorNum + "次开门");
    36 
    37                 /// 通知已经完成开门操作
    38                 dataChangeEvent.Set();
    39 
    40                 /// 在执行dataChangeEvent.Set()后,dataChangeEvent.WaitOne()开始获取信号,为防止没有获取到信号时
    41                 /// 又执行dataChangeEvent.Set()方法,则上次的dataChangeEvent.WaitOne()需要执行的代码不会被执行,
    42                 /// 所以暂时休眠,否则进门可能次数不够
    43                 Thread.Sleep(1);
    44             }
    45 
    46             Console.Read();
    47         }
    48 
    49         /// <summary>
    50         /// 完成进门操作
    51         /// </summary>
    52         private void InputDoor()
    53         {
    54             ///收到开门的线程通知,WaitOne方法如果在通知线程set()前如果能及时收到信号,则一直会处于阻塞代码
    55             /// 如果在dataChangeEvent.WaitOne()过程中获取信号同时,被调用线程给set()了,则dataChangeEvent.WaitOne()
    56             /// 应该是收不到信号的,所以要在调用线程中执行完dataChangeEvent.set()后应该休眠一会,在调用dataChangeEvent.set()
    57 
    58             /// 保证子线程一直在处于运行状态
    59             while (true)
    60             {
    61                 //if (dataChangeEvent.WaitOne())
    62                 //{
    63                 //    Console.WriteLine("	A第" + openDoorNum + "次进门");
    64                 //}
    65 
    66                 /// 等待100毫秒,没有收到信号则释放,继续往下面执行,date会被赋值
    67                 if (dataChangeEvent.WaitOne(100, false))
    68                 {
    69                     Console.WriteLine("" + Thread.CurrentThread.Name + "】A第" + openDoorNum + "次进门");
    70                 }
    71             }
    72         }
    73     }
    74 }
    搏击长空
  • 相关阅读:
    JS 中 == 和 === 区别是什么?
    说说事务的概念,在JDBC编程中处理事务的步骤
    JDBC访问数据库的基本步骤是什么?
    undefined,null 和 undeclared 有什么区别?
    Mybatis框架、什么是 MyBatis、#{}和${}的区别是什么?、Mybatis 动态 sql 是做什么的?都有、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    MyBatis 与 Hibernate 有哪些不同?
    Redis如何做内存优化?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/yitong/p/ManualResetEvent_AutoResetEvent.html
Copyright © 2011-2022 走看看