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(); |
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级