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(); |
一亿小目标手游
如果让你的人生从来,你可以像王健林一样霸气的表示一亿小目标吗
一亿小目标手机版2019
一亿小目标手机版2019趣味休闲模拟游戏,玩家在游戏中将会通
巴啦啦梦幻餐厅
巴啦啦梦幻餐厅是一款充满魔幻色彩的二次元模拟经营手游,游戏界
恋爱进行时九游版
恋爱进行时九游版是一款以模拟恋爱玩法为核心的角色扮演手游,精
皇室对决fr(Null’s Royale)
皇室对决fr,即皇室战争的私服变态版本,在该版本中玩家能够拥