C# 线程通信 一

本文通过一个具体的例子展示了C#中如何使用多线程进行通信,具体包括主线程与子线程之间的同步机制,如使用EventWaitHandle来协调两个线程之间的交互过程。

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("\tA第" + openDoorNum + "次进门");
64                 //}
65 
66                 /// 等待100毫秒,没有收到信号则释放,继续往下面执行,date会被赋值
67                 if (dataChangeEvent.WaitOne(100, false))
68                 {
69                     Console.WriteLine("\t 【" + Thread.CurrentThread.Name + "】A第" + openDoorNum + "次进门");
70                 }
71             }
72         }
73     }
74 }

 

转载于:https://www.cnblogs.com/yitong/p/ManualResetEvent_AutoResetEvent.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值