ManualResetEvent详解
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
ManualResetEvent例子
假设有一个程序中调用了三个异步方法,代码如下:
| 代码如下 | 复制代码 |
|
public class Test private Action public Test() public IAsyncResult BeginTodo(string message, AsyncCallback callback, object state) public void EndTodo(IAsyncResult ar) public class Program static void callback2(IAsyncResult ar) static void callback3(IAsyncResult ar) static public void Main(string[] args) Test test2 = new Test(); Test test3 = new Test(); Console.ReadKey(); |
|
执行结果如下图所示:
也就是说,异步方法的执行顺序是不固定的,但有时我们希望它们能按顺序执行,修改代码如下:
| 代码如下 | 复制代码 |
|
public class Program Test test2 = new Test(); static void callback2(IAsyncResult ar) Test test3 = new Test(); static void callback3(IAsyncResult ar) static public void Main(string[] args) Console.ReadKey(); |
|
看着有没有感觉很乱?能不能让代码既像开始那样有条理,又能按顺序执行呢?ManualResetEvent类出场了:
| 代码如下 | 复制代码 |
|
public class Program static void callback1(IAsyncResult ar) static void callback2(IAsyncResult ar) static void callback3(IAsyncResult ar) static public void Main(string[] args) Test test2 = new Test(); Test test3 = new Test(); Console.ReadKey(); |
|
创造与魔法九游版本
创造与魔法九游版采用了极致创新的魔幻游戏玩法感受,游戏具备最
疯狂医院达什医生中文版(Crazy Hospital)
疯狂医院达什医生最新版是一款医院模拟经营类游戏,逼真的场景画
宝宝庄园官方版
宝宝庄园官方版是一款超级经典好玩的模拟经营类型的手游,这个游
桃源记官方正版
桃源记是一款休闲娱乐类的水墨手绘风格打造的模拟经营手游。玩家
长途巴士模拟器手机版
长途巴士模拟器汉化版是一款十分比真好玩的大巴车模拟驾驶运营类