ManualResetEvent 类
通知一个或多个正在等待的线程已发生事件。无法继承此类。
命名空间: System.Threading
程序集: mscorlib(在 mscorlib.dll 中)
在 .NET Framework 2.0 版中,ManualResetEvent 从新的 EventWaitHandle 类派生。ManualResetEvent 在功能上等效于用 EventResetMode..::.ManualReset 创建的 EventWaitHandle。
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
ManualResetEvent 也可以同 staticWaitAll 和 WaitAny 方法一起使用。
有关线程同步机制的更多信息,请参见概念文档中的 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继续等待,ManualResetEvent超时后重置,VBNET源码,C#可用
这是一个ManualResetEvent最简单的测试代码,用最简单的代码解释了ManualResetEvent的用法。
ManualResetEvent Timer组件 托管函数 委托加减 我的委托 AsyncCallback
引入命名空间: using System.Threading; AutoResetEvent: autoResetEvent.WaitOne();//运行完后,**自动将事件...ManualResetEvent: manulResetEvent.WaitOne();//运行完后,**不会自动将事件状态设置为无信号**
简单讲解ManualResetEvent用法,DEMO可以运行,简单易懂
ManualResetEvent的用法.日积月累
ManualResetEven类的reset,waione,set方法的详细介绍,有多个实事例帮助理解
线程事例代码,ManualResetEvent,AutoResetEvent
本文实例为大家分享了ManualResetEvent的使用方法,供大家参考,具体内容如下 1. 源码下载: 下载地址:ManualResetEvent Demo: 2. ManualResetEvent详解 ManualResetEvent 允许线程通过发信号互相通信。通常,...
主要介绍了C# ManualResetEvent用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要为大家详细介绍了C#中ManualResetEvent用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后线程池将工作项放入可用线程中。...
因为ManualResetEvent当前正处于已触发状态; 需要主动调用 Reset(点击ManualEvent Reset按钮)才能再产生等待效果 **修改代码中创建语句,观察初始状态为true的情况 环境:VS2010 .NET4.0 希望对您有帮助。
ManualResetEvent是一个超时等待的线程锁,如果超时返回false,接收指令显示true,但是没法实现在超时后让他继续等待,这种需求我们可以用在以下场景: 控制线程超时方法 1.[主线程]:请求方发送请求,立即创建超时等待...
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading....
C#多线程学习(一) 多线程的相关概念 什么是进程?...ManualResetEvent对象有几个重要的方法 C#多线程学习(五) 多线程的自动管理(定时器Timer) C#多线程学习(六) 互斥对象Mutex Mutex 类的程序示例
C#多线程学习入门圣典 doc文档,对关键字进行排版和着色. ...ManualResetEvent对象有几个重要的方法 13 C#多线程学习(五) 多线程的自动管理(定时器Timer) 16 C#多线程学习(六) 互斥对象Mutex 18 Mutex 类的程序示例 18