Thread系列之ManualResetEvent(三)
来源:互联网 发布:tourex 源码 编辑:程序博客网 时间:2024/05/18 03:01
ManualResetEvent就像一个信号灯,可以利用它的信号,控制当前线程是挂起状态还是运行状态。
它有几个常用的方法:Reset(),Set(),WaitOne();
初始化该对象时,可以指定其默认的状态(有信号/无信号);
在初始化以后,该对象将保持原来的状态不变,直到它的Reset()或者Set()方法被调用;
Reset()方法将其设置为无信号状态,Set()方法将其设置为有信号状态;
WaitOne()方法在无信号状态下,可以使当前线程挂起;注意这里说的是当前线程;
直到调用了Set()方法,该线程才被激活。
在多线程的代码里,可以使用一个ManualResetEvent对象来控制线程所有线程;
只要在调用WaitOne()方法前,调用Reset()方法,因为WaitOne()控制的是当前线程;
但是这样做,ManualResetEvent对象的管理逻辑会变得复杂;
所以这里建议一条线程一个ManualResetEvent对象。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleThread
{
class ThreadClass
{
public void threadFun()
{
Thread.Sleep( 1000 );
Console.WriteLine( " ThreadClass.threadFun 1 " );
// 激活被挂起的线程
Program.allDone.Set();
Console.WriteLine( " ThreadClass.threadFun 2 " );
// 设置为无信号,如果注释这条语句,
// 下面的WaitOne()方法就不起做用了
Program.allDone.Reset();
// 使当前线程挂起
Program.allDone.WaitOne();
Console.WriteLine( " ThreadClass.threadFun 3 " );
}
} ;
class Program
{
public static ManualResetEvent allDone = new ManualResetEvent( false );
static void Main( string [] args)
{
Console.WriteLine( " Thread Start/Stop/Join Sample " );
ThreadClass ThreadC = new ThreadClass();
Thread thread = new Thread( new ThreadStart(ThreadC.threadFun));
thread.Start();
// 挂起当前线程
allDone.WaitOne();
Console.WriteLine( " Main 1 " );
// 因为ThreadClass.threadFun方法里调用了Reset()
// 所以这里的WaitOne()方法会使主线程也挂起
// allDone.WaitOne();
// 使主线程挂起1秒钟,
// 为了ThreadClass.threadFun方法里的Program.allDone.WaitOne()方法
// 运行时间在Main()方法的allDone.Set()方法前面
Thread.Sleep( 5000 );
// 设置为有信号
// 如果没有这条语句,ThreadClass.threadFun方法里最后一条语句就不会运行
allDone.Set();
Console.WriteLine( " Main 2 " );
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ConsoleThread
{
class ThreadClass
{
public void threadFun()
{
Thread.Sleep( 1000 );
Console.WriteLine( " ThreadClass.threadFun 1 " );
// 激活被挂起的线程
Program.allDone.Set();
Console.WriteLine( " ThreadClass.threadFun 2 " );
// 设置为无信号,如果注释这条语句,
// 下面的WaitOne()方法就不起做用了
Program.allDone.Reset();
// 使当前线程挂起
Program.allDone.WaitOne();
Console.WriteLine( " ThreadClass.threadFun 3 " );
}
} ;
class Program
{
public static ManualResetEvent allDone = new ManualResetEvent( false );
static void Main( string [] args)
{
Console.WriteLine( " Thread Start/Stop/Join Sample " );
ThreadClass ThreadC = new ThreadClass();
Thread thread = new Thread( new ThreadStart(ThreadC.threadFun));
thread.Start();
// 挂起当前线程
allDone.WaitOne();
Console.WriteLine( " Main 1 " );
// 因为ThreadClass.threadFun方法里调用了Reset()
// 所以这里的WaitOne()方法会使主线程也挂起
// allDone.WaitOne();
// 使主线程挂起1秒钟,
// 为了ThreadClass.threadFun方法里的Program.allDone.WaitOne()方法
// 运行时间在Main()方法的allDone.Set()方法前面
Thread.Sleep( 5000 );
// 设置为有信号
// 如果没有这条语句,ThreadClass.threadFun方法里最后一条语句就不会运行
allDone.Set();
Console.WriteLine( " Main 2 " );
}
}
}
- Thread系列之ManualResetEvent(三)
- Thread系列之ManualResetEvent
- Thread系列之ManualResetEvent(二)
- Thread系列之ManualResetEvent(四)
- C#Thread类多线程系列之(三)线程同步技术
- Java Thread学习之三
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- ManualResetEvent
- 多线程之AutoResetEvent和ManualResetEvent
- Thread 线程(三)
- 多线程编程(三)--创建线程之Thread VS Runnable
- 多线程编程(三)--创建线程之Thread VS Runnable
- 多线程编程(三)--创建线程之Thread VS Runnable
- Thread系列之Thread.Sleep(0)的真实意义
- c#利用WebClient和WebRequest获取网页源代码的比较
- WebRequest之Post写法
- c# 操作带frame的网页
- Thread系列之ManualResetEvent
- Thread系列之ManualResetEvent(二)
- Thread系列之ManualResetEvent(三)
- C#用HttpWebRequest通过代理服务器验证后抓取网页内容
- 给大家普及一下“nofollow”属性
- WINCE基于hive注册表的实现
- WINCE6.0文件系统及存储管理器
- 循序渐进PostgreSQL: 实现PostgreSQL自启动
- WinCE中的RAM-Based Registry与HIVE-Based Registry
- wince Hive注册表实现机制
- 初识WINCE的HIVE注册表