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(); |
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔