源码下载:
下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar
Demo:
2. ManualResetEvent详解
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
using System.Collections.Generic;
|
namespace ManualResetEventDemo
|
private ManualResetEvent _mre;
|
this ._mre = new ManualResetEvent( true );
|
public void CreateThreads()
|
Thread t1 = new Thread( new ThreadStart(Run));
|
Thread t2 = new Thread( new ThreadStart(Run));
|
string strThreadID = string .Empty;
|
strThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
|
Console.WriteLine( "Thread(" + strThreadID + ") is running..." );
|
Console.WriteLine( "线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString());
|
using System.Collections.Generic;
|
namespace ManualResetEventDemo
|
static void Main( string [] args)
|
Console.WriteLine( "****************************" );
|
Console.WriteLine( "输入\"stop\"停止线程运行..." );
|
Console.WriteLine( "输入\"run\"开启线程运行..." );
|
Console.WriteLine( "****************************\r\n" );
|
MREDemo objMRE = new MREDemo();
|
string input = Console.ReadLine();
|
if (input.Trim().ToLower() == "stop" )
|
Console.WriteLine( "线程已停止运行..." );
|
else if (input.Trim().ToLower() == "run" )
|
Console.WriteLine( "线程开启运行..." );
|
分享到:
相关推荐
2. ManualResetEvent详解 ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 ...
C#中ManualResetEvent用法详解 ManualResetEvent 是 C# 中的一种同步机制,它允许线程之间通过发送信号进行通信。下面我们将详细介绍 ManualResetEvent 的用法和实现原理。 一、ManualResetEvent 的介绍 ...
C# ManualResetEvent用法详解 C# ManualResetEvent是一种线程同步事件,可以对所有进行等待的线程进行统一管理。其构造函数为`public ManualResetEvent (bool initialState);`,参数`initialState`表示是否初始化,...
### C#多线程详解 #### 一、基础篇 **1. 怎样创建一个线程** 在C#中创建线程的方式有很多种,这里主要介绍三种常用的创建方式:使用`Thread`类、使用`Delegate.BeginInvoke`以及使用`ThreadPool....
系统内核对象是.NET中更底层的同步工具,包括互斥体(Mutex)、信号量(Semaphore)和事件(AutoResetEvent/ManualResetEvent)。互斥体确保同一时刻只有一个线程访问资源,而信号量可以控制同时访问资源的线程数量。事件...
- `ManualResetEvent`和`AutoResetEvent`:事件标志,用于等待线程完成特定操作。 - `CountdownEvent`:计数事件,当计数达到零时,所有等待的线程被释放。 - `Barrier`:屏障,使一组线程等待直到所有线程都到达...
例如,AutoResetEvent和ManualResetEvent分别用于单次信号和多次信号。这些事件可以与其他同步机制结合使用,以实现复杂的同步策略。 等待句柄是Windows操作系统级别的同步机制,如Mutex、Semaphore和Event。Mutex...
`System.Threading`命名空间提供了许多工具,如`ManualResetEvent`和`AutoResetEvent`,用于线程间的同步和通信。 九、线程异常处理 主线程可以捕获子线程的未处理异常,但需要注意线程的异常处理策略,以避免程序...
ManualResetEvent doneEvent = new ManualResetEvent(false); ... // 在子线程中 doneEvent.Set(); // 通知主线程任务已完成 ... // 在主线程中 doneEvent.WaitOne(); // 等待子线程完成 ``` 此外,线程优先级、...
你可能在上篇文章中《深入多线程之:双向信号与竞赛的用法分析》注意到了这个模式:两...去掉,那么我们就得到了一个基本的ManualResetEvent. 让我们使用Wait和Pulse来为ManualResetEvent完成剩余的代码吧。 代码如下:r
Monitor借助它的静态方法Wait,Pulse,PulseAll提供了一个更给力的信号构造,使用这些方法和lock语句,你可以自己实现AutoResetEvent,ManualResetEvent和Semaphore。甚至WaitHandle的WaitAll和WaitAny方法了。怎样...
### C# Socket 异步通信实现详解 #### 一、引言 在现代网络编程中,Socket 是一种广泛使用的通信方式。它允许不同计算机上的进程通过网络进行数据交换。为了提高程序的性能与响应能力,通常会采用异步操作来避免...
### Socket异步连接详解及示例代码解析 #### 一、引言 在现代网络通信中,`Socket`编程作为一种基础且重要的技术被广泛应用。它为应用程序提供了在不同计算机之间发送与接收数据的能力。根据应用需求的不同,可以...