ToB企服应用市场:ToB评测及商务社交产业平台

标题: ManualResetEvent和AutoResetEvent [打印本页]

作者: 宁睿    时间: 2023-9-1 15:16
标题: ManualResetEvent和AutoResetEvent
一、 ManualResetEventManualResetEvent是一个同步对象,可以使一个或多个线程等待另一个线程的信号,然后再同时继续执行。它是通过两个状态来实现的:有信号和无信号。以下是ManualResetEvent的各个方法的介绍:
  1. static ManualResetEvent mre = new ManualResetEvent(false);//创建了一个ManualResetEvent对象,并将初始状态设置为无信号状态
  2. static void Main(string[] args)
  3. {
  4.     //启动一个线程,等待信号
  5.     Thread thread = new Thread(new ThreadStart(WaitForSignal));
  6.     thread.Start();
  7.     //暂停一秒钟
  8.     Thread.Sleep(1000);
  9.     //发送信号
  10.     Console.WriteLine("Sending signal...");
  11.     mre.Set();  //将ManualResetEvent的状态设置为有信号,允许等待线程继续执行。如果没有线程在等待,该方法不会产生任何效果。
  12.     // 暂停一秒钟
  13.     Thread.Sleep(1000);
  14.     // 再次发送信号
  15.     Console.WriteLine("Sending signal again...");
  16.     mre.Set();
  17.     //等待线程完成
  18.     thread.Join();
  19.     Console.WriteLine("Done");
  20.     Console.ReadKey();
  21. }
  22. private static void WaitForSignal()
  23. {
  24.     Console.WriteLine("Waiting for signal...");
  25.     mre.WaitOne();  //阻塞当前线程,等待ManualResetEvent的状态变为有信号。如果ManualResetEvent的状态已经是有信号,该方法立即返回。
  26.     Console.WriteLine("Signal received.");
  27.     Console.WriteLine("Waiting for signal again...");
  28.     mre.Reset();    //将ManualResetEvent的状态设置为无信号,阻止等待线程继续执行。如果没有线程在等待,该方法不会产生任何效果。
  29.     mre.WaitOne();
  30.     Console.WriteLine("Signal received again.");
  31. }
复制代码

打印 Waiting for signal...后等待1s,
打印 Waiting for signal again...后等待1s.
 
二、AutoResetEvent
AutoResetEvent是一种同步机制,用于线程之间的通信。它允许一个线程等待另一个线程发出信号,然后继续执行。AutoResetEvent只能被一个线程等待,当一个线程调用WaitOne方法时,AutoResetEvent会被设置为非终止状态,直到另一个线程调用Set方法将其设置为终止状态。以下是AutoResetEvent的各个方法的介绍:
  1. static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
  2. static void Main(string[] args)
  3. {
  4.     Thread t1 = new Thread(new ThreadStart(Worker1));
  5.     t1.Start();
  6.     Thread t2 = new Thread(new ThreadStart(Worker2));
  7.     t2.Start();
  8.     Console.ReadKey();
  9. }
  10. static void Worker1()
  11. {
  12.     Console.WriteLine("Worker1 waiting for signal...");
  13.     autoResetEvent.WaitOne();
  14.     Console.WriteLine("Worker1 received signal and continuing...");
  15. }
  16. static void Worker2()
  17. {
  18.     Console.WriteLine("Worker2 sending signal...");
  19.     Thread.Sleep(1000);
  20.     autoResetEvent.Set();
  21. }
复制代码

打印Worker2 sending signal...后等待1s
三、AutoResetEvent和ManualResetEvent的异同
AutoResetEvent和ManualResetEvent都是.NET Framework中的同步原语,用于协调多个线程的执行。它们的主要区别在于: 1. 触发方式
2. 重置方式
3. 使用场景
总的来说,AutoResetEvent更适合用于线程间的协作,而ManualResetEvent更适合用于线程池等多线程并发执行的场景。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4