`
justdoithz
  • 浏览: 48662 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论
阅读更多

ManualResetEvent 类

通知一个或多个正在等待的线程已发生事件。无法继承此类。

命名空间: System.Threading
程序集: mscorlib(在 mscorlib.dll 中)

说明:

应用到此类型或成员的 HostProtectionAttribute 属性 (Attribute) 具有以下 Resources 属性 (Property) 值:Synchronization | ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护属性

在 .NET Framework 2.0 版中,ManualResetEvent 从新的 EventWaitHandle 类派生。ManualResetEvent 在功能上等效于用 EventResetMode..::.ManualReset 创建的 EventWaitHandle

说明:

ManualResetEvent 类不同,EventWaitHandle 类提供对已命名的系统同步事件的访问。

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。

一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。

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

ManualResetEvent 也可以同 staticWaitAllWaitAny 方法一起使用。

有关线程同步机制的更多信息,请参见概念文档中的 ManualResetEvent

<!---->

下面的代码示例阐释了如何使用等待句柄来发送复杂数字计算的不同阶段的完成信号。计算采用的格式为:结果 = 第一项 + 第二项 + 第三项,其中每一项都要求使用计算出的基数进行预计算和最终计算。

using System;
using System.Threading;

class CalculateTest { static void Main()
{
Calculate calc = new Calculate(); Console.WriteLine("Result = {0}.",
calc.Result(234).ToString());
Console.WriteLine("Result = {0}.",
calc.Result(55).ToString());
}
}

class Calculate
{
double baseNumber, firstTerm, secondTerm, thirdTerm;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;

// Generate random numbers to simulate the actual calculations.
Random randomGenerator;

public Calculate()
{
autoEvents = new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};

manualEvent = new ManualResetEvent(false);
}

void CalculateBase(object stateInfo)
{
baseNumber = randomGenerator.NextDouble();

// Signal that baseNumber is ready.
manualEvent.Set();
}

// The following CalculateX methods all perform the same
// series of steps as commented in CalculateFirstTerm.

void CalculateFirstTerm(object stateInfo)
{
// Perform a precalculation.
double preCalc = randomGenerator.NextDouble();

// Wait for baseNumber to be calculated.
manualEvent.WaitOne();

// Calculate the first term from preCalc and baseNumber.
firstTerm = preCalc * baseNumber *
randomGenerator.NextDouble();

// Signal that the calculation is finished.
autoEvents[0].Set();
}

void CalculateSecondTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
secondTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[1].Set();
}

void CalculateThirdTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
thirdTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[2].Set();
}

public double Result(int seed)
{
randomGenerator = new Random(seed);

// Simultaneously calculate the terms.
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateFirstTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateSecondTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateThirdTerm));

// Wait for all of the terms to be calculated.
WaitHandle.WaitAll(autoEvents);

// Reset the wait handle for the next calculation.
manualEvent.Reset();

return firstTerm + secondTerm + thirdTerm;
}
}

分享到:
评论

相关推荐

    ManualResetEvent继续等待.rar

    ManualResetEvent继续等待,ManualResetEvent超时后重置,VBNET源码,C#可用

    ManualResetEvent最简单的测试代码

    这是一个ManualResetEvent最简单的测试代码,用最简单的代码解释了ManualResetEvent的用法。

    ManualResetEvent Timer组件 托管函数 委托加减 我的委托 AsyncCallback

    ManualResetEvent Timer组件 托管函数 委托加减 我的委托 AsyncCallback

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

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

    C#线程同步ManualResetEvent

    简单讲解ManualResetEvent用法,DEMO可以运行,简单易懂

    ManualResetEvent的用法

    ManualResetEvent的用法.日积月累

    ManualResetEvent类的实例介绍

    ManualResetEven类的reset,waione,set方法的详细介绍,有多个实事例帮助理解

    AutoResetEvent_Examples.zip_AutoResetEvent_ManualResetEvent

    线程事例代码,ManualResetEvent,AutoResetEvent

    C# ManualResetEvent使用方法详解

    本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下 1. 源码下载: 下载地址:ManualResetEvent Demo: 2. ManualResetEvent详解  ManualResetEvent 允许线程通过发信号互相通信。通常,...

    C# ManualResetEvent用法详解

    主要介绍了C# ManualResetEvent用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    C#中ManualResetEvent用法详解

    主要为大家详细介绍了C#中ManualResetEvent用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    如何使用线程池

    首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后线程池将工作项放入可用线程中。...

    EventWaitHandle使用实例

    因为ManualResetEvent当前正处于已触发状态; 需要主动调用 Reset(点击ManualEvent Reset按钮)才能再产生等待效果 **修改代码中创建语句,观察初始状态为true的情况 环境:VS2010 .NET4.0 希望对您有帮助。

    vb.net C#线程锁超时控制代码

    ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...

    详细解析C#多线程同步事件及等待句柄

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading....

    c#多线程学习入门经典

    C#多线程学习(一) 多线程的相关概念 什么是进程?...ManualResetEvent对象有几个重要的方法 C#多线程学习(五) 多线程的自动管理(定时器Timer) C#多线程学习(六) 互斥对象Mutex Mutex 类的程序示例

    C#多线程学习入门圣典

    C#多线程学习入门圣典 doc文档,对关键字进行排版和着色. ...ManualResetEvent对象有几个重要的方法 13 C#多线程学习(五) 多线程的自动管理(定时器Timer) 16 C#多线程学习(六) 互斥对象Mutex 18 Mutex 类的程序示例 18

Global site tag (gtag.js) - Google Analytics