`
ljl_xyf
  • 浏览: 634081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于AutoResetEvent的使用

    博客分类:
  • c#
阅读更多

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 SetAutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止
状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true ;否则为 false

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。下面我们来举一个例子:我去书店买书,当我选中一本书后我会去收费处付钱,
付好钱后再去仓库取书。这个顺序不能颠倒,我作为主线程,收费处和仓库做两个辅助线程,代码如下:

http://www.my400800.cn

using 
System;
using 
System.Linq;
using 
System.Activities;
using 
System.Activities.Statements;
using 
System.Threading;

namespace 
CaryAREDemo
{
    class 
Me
    
{
        const int 
numIterations = 550
;
        static 
AutoResetEvent 
myResetEvent = new 
AutoResetEvent
(false
);
        static 
AutoResetEvent 
ChangeEvent = new 
AutoResetEvent
(false
);
        //static ManualResetEvent myResetEvent = new ManualResetEvent(false);
        //static ManualResetEvent ChangeEvent = new ManualResetEvent(false);
        
static int 
number; //这是关键资源

        
static void 
Main()
        {
            Thread 
payMoneyThread = new 
Thread
(new 
ThreadStart
(PayMoneyProc));
            payMoneyThread.Name = "付钱线程"
;
            Thread 
getBookThread = new 
Thread
(new 
ThreadStart
(GetBookProc));
            getBookThread.Name = "取书线程"
;
            payMoneyThread.Start();
            getBookThread.Start();

            for 
(int 
i = 1
; i <= numIterations; i++)
            {
                Console
.WriteLine("买书线程:数量{0}"
, i);
                number = i;
                //Signal that a value has been written.
                
myResetEvent.Set();
                ChangeEvent.Set();
                Thread
.Sleep(0
);
            }
            payMoneyThread.Abort();
            getBookThread.Abort();
        }

        static void 
PayMoneyProc()
        {
            while 
(true
)
            {
                myResetEvent.WaitOne();
                //myResetEvent.Reset();
                
Console
.WriteLine("{0}:数量{1}"
, Thread
.CurrentThread.Name, number);
            }
        }
        static void 
GetBookProc()
        {
            while 
(true
)
            {
                ChangeEvent.WaitOne();
                // ChangeEvent.Reset();               
                
Console
.WriteLine("{0}:数量{1}"
, Thread
.CurrentThread.Name, number);
                Console
.WriteLine("------------------------------------------"
);
                Thread
.Sleep(0
);
            }
        }
    }
}
运行结果如下:
image

AutoResetEvent与ManualResetEvent的区别

他们的用法\声明都很类似,Set方法将信号置为发送状态 Reset方法将信号置为不发送状态WaitOne等待信号的发送。其实,从名字就可以看出一个手动,
一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子:

public AutoResetEvent autoevent=new AutoResetEvent(true);
public ManualResetEvent manualevent=new ManualResetEvent(true);

默认信号都处于发送状态,

autoevent.WaitOne();
manualevent.WaitOne();

如果 某个线程调用上面该方法,则当信号处于发送状态时,该线程会得到信号,得以继续执行。差别就在调用后,autoevent.WaitOne()每次只允许一个线程
进入,当某个线程得到信号(也就是有其他线程调用了autoevent.Set()方法后)后,autoevent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只
有继续等待.也就是说,autoevent一次只唤醒一个线程。而manualevent则可以唤醒多个线程,因为当某个线程调用了set方法后,其他调用waitone的线程
获得信号得以继续执行,而manualevent不会自动将信号置为不发送.也就是说,除非手工调用了manualevent.Reset().方法,则 manualevent将一直保持有信号状态,manualevent也就可以同时唤醒多个线程继续执行。如果上面的程序换成 ManualResetEvent的话,就需要在waitone后面做下reset。

分享到:
评论

相关推荐

    多线程使用AutoResetEvent

    多线程使用AutoResetEvent

    C#线程同步AutoResetEvent

    下面的DEMO展示了如何使用`AutoResetEvent`实现多线程执行,主线程等待所有子线程完成后再继续执行其他业务。 ```csharp using System; using System.Threading; class Program { static AutoResetEvent[] ...

    AutoResetEvent_Examples.zip_AutoResetEvent_ManualResetEvent

    可以创建一个 `AutoResetEvent` 实例,当资源可用时,主线程调用 `Set()` 方法,唤醒等待的线程,使用完资源后,`AutoResetEvent` 自动重置,使得其他线程继续等待。 接下来是 `ManualResetEvent`。与 `...

    C# 多线程同步、异步_AutoResetEvent用法

    本文将深入探讨如何使用`AutoResetEvent`类实现线程间的同步和异步操作,以及如何在Visual Studio 2008环境下进行有效应用。 ### 一、多线程基础 多线程允许程序同时执行多个任务,提高系统资源利用率和程序响应...

    autoResetEvent示例

    为了确保线程安全,我们需要使用`AutoResetEvent`来同步这些操作。 1. **初始化**:首先,我们创建一个`AutoResetEvent`实例,通常设置为未设置状态(Unsignaled),表示没有任务可处理。例如: ```csharp ...

    C# 多线程同步与互斥,使用Mutex和AutoResetEvent类

    在提供的"multiThreading"文件夹中,可能包含了一个或多个人工测试用例,用于演示如何在实际项目中使用Mutex和AutoResetEvent。通过分析这些代码,可以深入理解如何在多线程环境中实现同步和互斥,以及如何解决可能...

    C#使用AutoResetEvent实现同步

    就知道AutoResetEvent这个东西和线程有关,用于处理线程切换之类,于是决定用AutoResetEvent来处理上面的问题。 于是网上查找相关资料: 原来,AutoResetEvent在.Net多线程编程中经常用到。当某个线程调用WaitOne...

    线程同步机制-AutoResetEvent

    AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前...

    C# 多线程的同步与互斥(使用Mutex和Event)

    下面是一个简单的示例,展示了Mutex和AutoResetEvent的使用: ```csharp using System; using System.Threading; class MultiThreadingExample { private static Mutex mutex = new Mutex(); private static ...

    python实现AutoResetEvent类的阻塞模式方法解析

    搞过C#多线程的人对其中的AutoResetEvent和ManualResetEvent这两个类都理解,其中的WaitOne()方法和Set()以及Reset()方法在线程同步当中用的是比较多的。 AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程...

    C#-【多线程篇】AutoResetEvent和ManualResetEvent的区别(中级)

    引入命名空间: ...AutoResetEvent: autoResetEvent.WaitOne();//运行完后,**自动将事件状态设置为无信号** ManualResetEvent: manulResetEvent.WaitOne();//运行完后,**不会自动将事件状态设置为无信号**

    关于线程同步等待的两种代码示例

    在`Program1.cs`中,我们可能看到使用`AutoResetEvent`的示例。`AutoResetEvent`的特点在于,一旦有线程释放信号,只有一个等待的线程会被唤醒,之后自动重置为无信号状态。以下是一个简单的`AutoResetEvent`使用...

    Optimizing Wait in MultiThreading Environment - C#

    总之,通过使用`AutoResetEvent`,开发人员能够在多线程环境中更有效地管理和优化线程间的等待时间,从而提升整个应用程序的性能和稳定性。然而,正确使用这一工具需要深入理解其工作原理和应用场景,以及遵循相应的...

    C# 线程例程,autoreset

    本文将深入探讨`AutoResetEvent`的工作原理、使用场景以及如何在实际项目中应用。 `AutoResetEvent`属于`System.Threading`命名空间,它是一个信号量,可以被一个或多个等待线程用来同步执行。当`AutoResetEvent`的...

    多线程与网络编程

    本文将重点解析多线程中的线程同步机制,特别是`AutoResetEvent`和`ManualResetEvent`这两种关键同步对象的特性和使用场景。 #### 终止状态与非终止状态:理解线程的生命周期 在多线程编程中,线程的生命周期至关...

    c#多线程顺序打印1-100数字-源码.rar

    在这个例子中,开发者使用了`AutoResetEvent`这一线程同步工具。 `AutoResetEvent`是.NET Framework提供的一个等待句柄,它允许一个或多个线程等待特定事件的发生。当事件发生时(即`Set()`方法被调用),一个等待...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)_《0528》.rar

    AutoResetEvent signal = new AutoResetEvent(false); // ... signal.Set(); // 通知其他线程可以继续 signal.WaitOne(); // 阻塞当前线程,直到接收到信号 ``` 6. **线程优先级** 尽管可以设置线程的优先级...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)

    - **AutoResetEvent** 和 **ManualResetEvent**:用于线程间的同步,一个线程等待另一个线程发出信号后才能继续执行。 - **CountdownEvent**:计数器事件,当计数值减到零时,所有等待的线程会被唤醒。 7. **线程...

Global site tag (gtag.js) - Google Analytics