先看一段代码:

public class WaitHandlerExample {

public static AutoResetEvent waitHandler;

public static ManualResetEvent manualWaitHandler;


public static void ThreadPoolMain() {

waitHandler = new AutoResetEvent(false);

manualWaitHandler = new ManualResetEvent(false);


// Queue the task.

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc2));


Console.WriteLine("Main thread does some work, then waiting....");

manualWaitHandler.WaitOne();

//waitHandler.Reset();

manualWaitHandler.WaitOne();

//waitHandler.Reset();

Console.WriteLine("Main thread exits.");

}


// This thread procedure performs the task.

public static void ThreadProc(Object stateInfo) {

Thread.Sleep(1000);

Console.WriteLine("Hello from the thread pool.");

//waitHandler.Set();//

manualWaitHandler.Set();//过去了,但是没关,也就是说 信号还是开着的。

//manualWaitHandler.Reset();

}

public static void ThreadProc2(object stateInfo) {

Thread.Sleep(100);

Console.WriteLine("Hello from the thread Pool2");

//waitHandler.Set();

manualWaitHandler.Set();//过去了,但是没有关

}

}
如果把 AutoResetEvent 比作 北京地铁的门闸,那么
AutoResetEvent waitHandler=new AutoResetEvent(false);
可以看作,初始化闸机口为关闭状态,
waitHandler.WaitOne();
可以看作刷卡
waitHandler.Set()
表示通过,并且闸机自动关闭(AutoReset)为下次通过做准备。他的一个重大的好处,就是线程只能一个一个通过,保持了顺序又避免了死锁。
如果使用manualResetEvent 呢,那么在waitHandler.Set 之后,必须调用Reset()方法,为下面一位进去做好准备, 否则,就相当于无法再次刷卡。
体现在程序中就是,AutoResetEvent 可以WaitOne 很多次,可是ManualResetEvent 如果不Reset 下次就不能使用. 这就是他们的区别。
本文出自 “Xhinker” 博客,转载请与作者联系!
转帖:http://xhinker.blog.51cto.com/640011/180377
分享到:
相关推荐
在C#编程中,线程同步是一个至关重要的概念,特别是在多线程环境下,它用于控制多个线程对共享资源的访问,确保数据的一致性和程序的正确性。本篇文章将详细探讨`AutoResetEvent`这一线程同步工具,并通过一个DEMO来...
可以创建一个 `AutoResetEvent` 实例,当资源可用时,主线程调用 `Set()` 方法,唤醒等待的线程,使用完资源后,`AutoResetEvent` 自动重置,使得其他线程继续等待。 接下来是 `ManualResetEvent`。与 `...
3. **手动重置**:与`ManualResetEvent`不同,`AutoResetEvent`只允许一个线程通过,如果需要多次触发,需要再次调用`Set()`方法。 ### 四、AutoResetEvent的使用 在C#中,我们可以这样使用`AutoResetEvent`: ``...
1. **初始化**:首先,我们创建一个`AutoResetEvent`实例,通常设置为未设置状态(Unsignaled),表示没有任务可处理。例如: ```csharp AutoResetEvent taskAvailable = new AutoResetEvent(false); ``` 2. **添加...
在提供的"multiThreading"文件夹中,可能包含了一个或多个人工测试用例,用于演示如何在实际项目中使用Mutex和AutoResetEvent。通过分析这些代码,可以深入理解如何在多线程环境中实现同步和互斥,以及如何解决可能...
- **AutoResetEvent** 和 **ManualResetEvent**:用于线程间的同步,一个线程等待另一个线程发出信号后才能继续执行。 - **CountdownEvent**:计数器事件,当计数值减到零时,所有等待的线程会被唤醒。 7. **线程...
引入命名空间: using System.Threading; AutoResetEvent: autoResetEvent.WaitOne();//运行完后,**自动将事件状态设置为无信号** ...manulResetEvent.WaitOne();//运行完后,**不会自动将事件状态设置为无信号**
实例中可能展示了如何实例化`Thread`对象,传递一个执行方法的委托,并调用`Start()`方法来启动新线程。 2. **后台线程** 通过设置`IsBackground`属性,可以将线程标记为后台线程。后台线程不会阻止应用程序的退出...
另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求。说真的,一直做BS项目,对线程了解,还真不多。就知道AutoResetEvent这个东西和线程有关,用于处理线程切换之类,于是决定用...
- 使用`Thread`类:通过创建`Thread`对象并传递一个委托(方法)作为参数,可以启动新线程。例如: ```csharp Thread thread = new Thread(new ThreadStart(MyMethod)); thread.Start(); ``` - 使用`...
本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。以下是这些实例可能涉及的关键知识点: 1. **线程创建**:C#中创建线程主要有两种方式,一是通过`System.Threading.Thread`...
AutoResetEvent 允许线程通过发信号互相通信。...AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态
这些实例覆盖了Visual C++ 2005编程的多个关键领域,包括.NET框架的使用、多线程编程、反射、错误处理和程序集管理。通过深入研究这些源代码,开发者能够提升对C++ 2005特性和.NET框架的理解,进而提高其在Windows...
3. **线程互斥**:`Mutex`和`Monitor`是实现互斥的重要工具,确保同一时间只有一个线程可以访问特定资源。实例中可能会展示如何使用`Mutex.WaitOne()`和`Mutex.ReleaseMutex()`,或者`Monitor.Enter()`和`Monitor....
使用`Thread`类时,可以创建一个新的`Thread`对象并调用其`Start`方法启动。 2. **线程状态管理**:线程有多种状态,如新建、就绪、运行、等待、挂起和终止。通过`Thread`对象的属性如`IsAlive`和`ThreadState`可以...
在实例实战中,我们可能会看到如何使用`new Thread()`来创建新线程,以及如何使用`Task.Run()`来启动一个异步任务。 多线程编程的一个关键问题是线程同步。在"单个写入/多个阅读"的场景下,线程安全是必须考虑的...
实例可能会演示`Enter()`和`Exit()`方法的使用。 - **Mutex和Semaphore**:`Mutex`和`Semaphore`是更高级的同步工具,它们可以控制多个线程对共享资源的访问数量。`Mutex`允许一次只有一个线程访问,而`Semaphore`...
最常用的是`Thread`类,通过实例化这个类并调用其`Start`方法,我们可以启动一个新的线程。此外,`ThreadPool`也是一个重要的工具,它可以高效地管理和重用线程,适用于执行短期任务。 交通信号灯的控制可以视为一...