,,C# ManualResetEvent用法详解

,,C# ManualResetEvent用法详解

本文主要介绍C # ManualReseteEvent的用法详解,通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值。有需要的朋友下面跟边肖学习。

ManualResetEvent表示线程同步事件,可以统一管理所有等待的线程(收到信号时必须手动复位事件)。

它的构造函数是:

public manual reset event(bool initial state);

参数initialState指示是否初始化;如果为真,则初始状态设置为终止(非阻塞);如果为false,则初始状态设置为非终止(阻塞)。

注意:如果其参数设置为true,ManualResetEvent等待的线程将不会阻塞。如果初始状态为false,线程将被阻塞,直到Set调用方法。

它只有两条路。

//将事件状态设置为终止状态,从而允许一个或多个等待线程继续执行。

公共布尔集();

//将事件状态设置为非终止,这将导致线程被阻塞。

公共bool Reset();

//返回值:操作成功返回真,否则返回假

说到这里,我们举个例子来了解一下。

使用系统;

使用系统。穿线;

公共类示例

{

//mre用于手动阻塞和释放线程。它是

//在无信号状态下创建。

private static ManualResetEvent MRE=new ManualResetEvent(false);

静态空干管()

{

控制台。WriteLine(' \ n启动在ManualResetEvent上阻塞的3个命名线程:\ n ');

for(int I=0;I=2;我)

{

Thread t=新线程(Thread proc);

t.name=' Thread _ ' I;

t.start();//启动线程

}

线程。睡眠(500);

控制台。WriteLine(' \ n当所有三个线程都启动后,按Enter调用Set()'

\ n释放所有线程。\ n’);

控制台。ReadLine();

mre。set();

线程。睡眠(500);

控制台。WriteLine(' \ n当发出ManualResetEvent信号时,调用WaitOne()的线程

\ n不要阻止。按回车键显示此信息。\ n’);

控制台。ReadLine();

for(int I=3;I=4;我)

{

Thread t=新线程(Thread proc);

t.name=' Thread _ ' I;

t.start();

}

线程。睡眠(500);

控制台。WriteLine(' \ n按Enter调用Reset(),以便线程再次阻塞'

\ n当他们调用WaitOne()时。\ n’);

控制台。ReadLine();

mre。reset();

//启动一个等待ManualResetEvent的线程。

线程t5=新线程(Thread proc);

t5。Name=' Thread _ 5

t5。start();

线程。睡眠(500);

控制台。WriteLine(' \ n按Enter调用Set()并结束演示。);

控制台。ReadLine();

mre。set();

//如果在Visual Studio中运行此示例,请取消对以下行的注释:

//控制台。ReadLine();

}

私有静态void ThreadProc()

{

字符串名称=线程。当前线程名称;

控制台。WriteLine(name '启动并调用mre。wait one()');

mre。wait one();//阻塞线程,直到调用Set方法。

控制台。WriteLine(name '结束。);

}

}

结果如下

流程:

该示例以信号state ManualResetEvent开始(false被传递给构造函数)。三个线程,每个线程在调用其WaitOne方法时都被阻塞。当用户按Enter键时,该示例调用Set方法,该方法释放所有三个线程以继续执行。

再次按下“输入”键。此时,ManualResetEvent将保持终止状态,直到调用Reset方法,因此这些线程在调用WaitOne方法时不会被阻塞,而是会运行到完成。即对应上述(收到信号时必须手动复位事件)。

再次按enter将导致该示例调用Reset方法并启动一个线程,当调用WaitOne时,该线程将被阻止。回车,最后一次调用Set释放最后一个线程,程序结束。

如果不清楚,可以一步步调试,这样就能明白了!

请参阅MSDN:手动重置事件类别

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 设计一个简单的C#控制台应用程序,C#控制台程序,C# 创建控制台应用程序
  • 深入解析windows第8版,深入解析C#(第4版)
  • 数组代码,c# 数组操作,C# 数组实例介绍(图文)
  • 学会C#要多久,学会c#要多久,c#学习之30分钟学会XAML
  • 回溯法01背包问题c,回溯法求解01背包问题伪代码,C#使用回溯法解决背包问题实例分析
  • xml文件转义字符,xml转意字符,C# XML中的转义字符操作
  • winform 进度条控件,c# 进度条使用
  • winform 进度条控件,c# 进度条使用,C#使用winform实现进度条效果
  • winform backgroundworker,c# isbackground
  • winform backgroundworker,c# isbackground,C# BackgroundWorker用法详解
  • lua与c#交互,lua c#
  • lua与c#交互,lua c#,ToLua框架下C#与Lua代码的互调操作
  • linq c#,linq原理 c#
  • linq c#,linq原理 c#,c#中LINQ的基本用法实例
  • java decimal保留两位小数,sql中decimal函数保留2位小数,C#中decimal保留2位有效小数的实现方法
  • 留言与评论(共有 条评论)
       
    验证码: