ManualResetEvent详解
ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
ManualResetEvent例子
假设有一个程序中调用了三个异步方法,代码如下:
| 代码如下 | 复制代码 |
|
public class Test private Action _todo = null; 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(); |
|
uc浏览器网页版入口官网-手机/电脑uc浏览器网页版入口地址
little fox官方网站入口地址-little fox网页版中国官网入口地址
樱花动漫网官网在线观看入口-樱花动漫网最新网页版入口地址2026
剑桥少儿英语官网入口网址-剑桥少儿英语网页版入口地址
手机百度网盘登录入口地址-百度网盘手机网页版登录入口地址
192.168.1.1无线路由怎么访问?192.168.1.1无线路由器设置登录入口地址