C# ManualResetEvent使用方法详解

作者:田志良 时间:2022-05-15 23:57:51 

本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下

1. 源码下载:

下载地址:ManualResetEvent

Demo:

C# ManualResetEvent使用方法详解

2. ManualResetEvent详解

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ManualResetEventDemo
{
class MREDemo
{
 private ManualResetEvent _mre;

public MREDemo()
 {
  this._mre = new ManualResetEvent(true);
 }

public void CreateThreads()
 {
  Thread t1 = new Thread(new ThreadStart(Run));
  t1.Start();

Thread t2 = new Thread(new ThreadStart(Run));
  t2.Start();
 }

public void Set()
 {
  this._mre.Set();
 }

public void Reset()
 {
  this._mre.Reset();
 }

private void Run()
 {
  string strThreadID = string.Empty;
  try
  {
   while (true)
   {
    // 阻塞当前线程
    this._mre.WaitOne();

strThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
    Console.WriteLine("Thread(" + strThreadID + ") is running...");

Thread.Sleep(5000);
   }
  }
  catch(Exception ex)
  {
   Console.WriteLine("线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString());
  }
 }

}
}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ManualResetEventDemo
{
class Program
{
 static void Main(string[] args)
 {
  Console.WriteLine("****************************");
  Console.WriteLine("输入\"stop\"停止线程运行...");
  Console.WriteLine("输入\"run\"开启线程运行...");
  Console.WriteLine("****************************\r\n");

MREDemo objMRE = new MREDemo();
  objMRE.CreateThreads();

while (true)
  {
   string input = Console.ReadLine();
   if (input.Trim().ToLower() == "stop")
   {
    Console.WriteLine("线程已停止运行...");
    objMRE.Reset();
   }
   else if (input.Trim().ToLower() == "run")
   {
    Console.WriteLine("线程开启运行...");
    objMRE.Set();
   }
  }

}
}
}

标签:C#,ManualResetEvent
0
投稿

猜你喜欢

  • 使用Spring Data Redis实现数据缓存的方法

    2021-08-02 10:19:25
  • C#指针变量与unsafe的实现

    2022-09-05 09:34:10
  • 浅析Android Service中实现弹出对话框的坑

    2023-04-20 16:17:13
  • c++动态内存管理详解(new/delete)

    2022-07-09 11:53:26
  • Android中应用多进程的整理总结

    2022-05-05 04:25:21
  • C#实现动态创建接口并调用的实例

    2021-11-12 16:38:17
  • Android使用线程获取网络图片的方法

    2023-05-28 22:29:28
  • Android应用开发中使用Fragment的入门学习教程

    2023-05-17 04:30:59
  • 关于Future机制原理及解析

    2022-01-23 03:57:48
  • C#中属性和成员变量的区别说明

    2022-02-17 22:36:57
  • 使用注解@Validated效验VO参数是否合规

    2023-10-27 20:13:01
  • Flutter 底部弹窗如何实现多项选择

    2023-06-24 17:08:17
  • Java8新特性之泛型的目标类型推断_动力节点Java学院整理

    2023-11-26 10:38:21
  • Springboot整合Dozer实现深度复制的方法

    2023-11-12 17:18:11
  • C#远程发送和接收数据流生成图片的方法

    2021-08-31 00:30:10
  • IDEA 2020.3.X 创建scala环境的详细教程

    2022-07-16 11:44:47
  • 全面了解Java中的内部类和匿名类

    2023-01-05 09:14:23
  • Android 中 SwipeLayout一个展示条目底层菜单的侧滑控件源码解析

    2022-03-10 14:25:33
  • C#中变量、常量、枚举、预处理器指令知多少

    2021-05-26 18:29:11
  • java处理图片背景颜色的方法

    2023-11-27 04:38:20
  • asp之家 软件编程 m.aspxhome.com