初次体验
ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步;以下一段是引述网上和MSDN的解析:
在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。如果某个线程调用WaitOne方法,则当信号处于发送状态时,该线程会得到信号, 继续向下执行。其区别就在调用后,AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,AutoResetEvent一次只唤醒一个线程;而ManualResetEvent则可以唤醒多个线程,因为当某个线程调用了ManualResetEvent.Set()方法后,其他调用WaitOne的线程获得信号得以继续执行,而ManualResetEvent不会自动将信号置为不发送。也就是说,除非手工调用了ManualResetEvent.Reset()方法,则ManualResetEvent将一直保持有信号状态,ManualResetEvent也就可以同时唤醒多个线程继续执行。
本质上AutoResetEvent.Set()方法相当于ManualResetEvent.Set()+ManualResetEvent.Reset();
因此AutoResetEvent一次只能唤醒一个线程,其他线程还是堵塞
生动示例
用一个三国演义的典故来写段示例代码:
话说曹操率领80W大军准备围剿刘备和孙权,面对敌众我寡的情况,诸葛亮与周瑜想到了一个妙计,用装满火药桶的大船去冲击曹操连在一起的战船,计划都安排好了,可谓“万事俱备 只欠东风”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading;
namespace
Test
{
class
Program
{
private
static ManualResetEvent mre =
new ManualResetEvent( false );
static
void Main( string [] args)
{
EastWind wind =
new EastWind(mre);
Thread thd =
new Thread( new
ThreadStart(wind.WindComming));
thd.Start();
mre.WaitOne();
Console.WriteLine( "诸葛亮大吼:东风来了,可以进攻了,满载燃料的大船接着东风冲向曹操的战船" );
Console.ReadLine();
}
}
/// <summary>
/// 传说中的东风
/// </summary>
class
EastWind
{
ManualResetEvent _mre;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="mre"></param>
public
EastWind(ManualResetEvent mre)
{
_mre = mre;
}
/// <summary>
/// 风正在吹过来
/// </summary>
public
void WindComming()
{
Console.WriteLine( "东风正在吹过来" );
for
( int
i = 0; i <= 5; i++)
{
Thread.Sleep(500);
Console.WriteLine( "东风吹啊吹,越来越近了..." );
}
Console.WriteLine( "东风终于到了" );
_mre.Set();
}
}
}
|
运行结果:

分享到:
相关推荐
在Visual Studio 2008中,创建多线程项目时,可以选择"新建项目"->"Visual C#"->"Windows应用程序",然后在代码中引入`System.Threading`命名空间,即可使用`AutoResetEvent`进行多线程同步和异步操作。 总结,`...
引入命名空间: ...AutoResetEvent: autoResetEvent.WaitOne();//运行完后,**自动将事件状态设置为无信号** ManualResetEvent: manulResetEvent.WaitOne();//运行完后,**不会自动将事件状态设置为无信号**
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...
在C#编程中,多线程同步和互斥是并发编程中的关键概念,它们用于确保在多线程环境中数据的一致性和程序的正确性。Mutex(互斥锁)和AutoResetEvent(自动重置事件)是.NET框架提供的两种工具,用于解决这些问题。 ...
"10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...
在C#编程中,多线程是一个至关重要的概念,它允许程序同时执行多个任务,从而提高了应用程序的效率和...这些知识点涵盖了C#多线程编程的基础到进阶内容,通过学习和实践,开发者能够创建高效、稳定的多线程应用程序。
这个“C#多线程实例”压缩包很可能包含了一系列关于如何在C#中实现和管理多线程的代码示例。下面将详细阐述多线程的基本概念、应用场景以及C#中实现多线程的关键技术。 一、多线程基础 1. **线程定义**:线程是...
本资源“C#多线程开发之并发编程经典实例”提供了丰富的实例,旨在帮助C#开发者深入理解并掌握多线程技术。以下是关于C#多线程和并发编程的一些关键知识点: 1. **线程基础**:线程是操作系统分配CPU时间的基本单位...
总之,`ManualResetEvent`是C#中进行线程同步的重要工具,它提供了灵活的控制机制,使得开发者能够有效地管理和协调多线程程序的行为。通过理解和熟练运用,我们可以编写出更稳定、高效的多线程应用。
在C#编程中,多线程和异步处理是提高应用程序性能和响应能力的重要手段。在执行长时间运行的任务时,如大数据处理、网络下载或I/O密集型操作,使用多线程可以避免阻塞主线程,使用户界面(UI)保持响应。而异步操作...
C#多线程是.NET框架中的一个重要特性,它允许开发者在同一时间内执行多个任务,从而提高应用程序的效率和响应性。在处理大量数据、实现并发操作或进行后台处理时,多线程技术尤其有用。本参考手册将深入探讨C#中的多...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...
下面我们将深入探讨C#多线程在WINFORM中的应用及其相关知识点。 1. **线程基础** - **主线程**:每个应用程序都有一个主线程,它是程序运行的起点,负责创建和管理UI(用户界面)。 - **工作线程**:非UI线程,...
总结,本资料“C#多线程学习代码资料”会涵盖这些知识点,并通过示例代码帮助初学者理解多线程的创建、同步、通信以及异常处理等概念,是学习C#多线程编程的良好起点。通过深入学习和实践,开发者能够更好地掌握多...
本压缩包文件"**C#多线程多任务管理模型**"提供了相关的代码示例和项目资源,帮助开发者深入理解和应用这一技术。 1. **线程基础**: - **线程定义**:线程是操作系统分配CPU时间的基本单元,一个进程可以有多个...
本示例中的“C#多线程实现简单的任务管理器”是一个很好的学习资源,旨在帮助初学者理解多线程的概念及其在实际应用中的运用。 1. **线程基础**: - **线程与进程**:线程是操作系统分配CPU时间的基本单元,而进程...
以下是对标题和描述中提到的C#多线程知识点的详细解释: 1. **线程创建**:C#提供多种方式创建线程,如`System.Threading.Thread`类的构造函数,`System.Threading.Tasks.Task`类,以及异步编程模型(async/await)...
### C#多线程教材知识点详解 #### 一、概述与概念 - **多线程的概念**:在C#中,多线程是指程序能够同时处理多个任务的能力。每个线程都有自己的执行路径,能够在同一时间内与其他线程并行运行。这种特性极大地...
理解并熟练掌握这些C#多线程知识,对于编写高效、稳定的并发应用程序至关重要。在实际开发中,需要根据具体需求选择合适的线程管理策略,同时注意避免死锁、饥饿等并发问题。通过不断的实践和学习,可以更好地驾驭C#...