C#使用AutoResetEvent实现同步的详解及实例


本文摘自PHP中文网,作者黄舟,侵删。

这篇文章主要为大家详细介绍了C#使用AutoResetEvent实现同步的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求。另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求。说真的,一直做BS项目,对线程了解,还真不多。就知道AutoResetEvent这个东西和线程有关,用于处理线程切换之类,于是决定用AutoResetEvent来处理上面的问题。

于是网上查找相关资料:

原来,AutoResetEvent在.Net多线程编程中经常用到。当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待。而且 AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程,其他线程还是堵塞。

简介

AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。
false:无信号,子线程的WaitOne方法不会被自动调用
true:有信号,子线程的WaitOne方法会被自动调用
 Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。
 Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。
 WaitOne(): 阻止当前线程,直到收到信号。
 WaitOne(TimeSpan, Boolean) :阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。
WaitAll():等待全部信号。

实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

class Program

{

 

 static void Main()

 {

  Request req = new Request();

 

  //这个人去干三件大事

  Thread GetCarThread = new Thread(new ThreadStart(req.InterfaceA));

  GetCarThread.Start();

 

  Thread GetHouseThead = new Thread(new ThreadStart(req.InterfaceB));

  GetHouseThead.Start();

 

  //等待三件事都干成的喜讯通知信息

  AutoResetEvent.WaitAll(req.autoEvents);

 

  //这个人就开心了。

  req.InterfaceC();

 

  System.Console.ReadKey();

 }

}

 

public class Request

{

 //建立事件数组

 public AutoResetEvent[] autoEvents = null;

 

 public Request()

 {

  autoEvents = new AutoResetEvent[]

  {

   new AutoResetEvent(false),

   new AutoResetEvent(false)

  };

 }

 

 public void InterfaceA()

 {

  System.Console.WriteLine("请求A接口");

 

  Thread.Sleep(1000*2);

 

  autoEvents[0].Set();

 

  System.Console.WriteLine("A接口完成");

 }

 

 public void InterfaceB()

 {

  System.Console.WriteLine("请求B接口");

 

  Thread.Sleep(1000 * 1);

 

  autoEvents[1].Set();

 

  System.Console.WriteLine("B接口完成");

 }

 

 public void InterfaceC()

 {

  System.Console.WriteLine("两个接口都已经请求完,正在处理C");

 }

}

注意,WaitOne 或是WaitAll 最好都加上超时时间。否则没有收到信号,线程一直会阻塞。

后话

这个只是上面的场景的一个简化,主要是用来解决刚刚我说的那个场景的问题。
以上是自己对AutoResetEvent的使用总结。不足之处请各位指点一二。

以上就是C#使用AutoResetEvent实现同步的详解及实例的详细内容!

相关阅读 >>

C#中关于ajax跨域访问问题的详细介绍

C#中的委托实例代码详解(图文)

C#中static void main(string[] args) 参数的示例代码详解

怎样用C#打印一个n行的菱形?实战详解

C#中序列化实现深拷贝和datagridview初始化刷新的方法介绍

分析C#httpwebrequest访问https错误处理的方法

C#单位转换器的图文代码详细介绍

C# winform webbrowser 设置为编辑模式的示例代码

C#实现带百分比的进度条功能的示例代码分享

C#中常用的运算符有哪些

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...