C# 创建线程的简单方式:异步委托 .

定义一个委托调用的方法:TakesAWhile

[c-sharp] view plain copy print ?
  1. //定义委托要引用的方法   
  2. private static int TakesAWhile(int data, int ms)  
  3. {  
  4.     Console.WriteLine("开始...");  
  5.   
  6.     //当前线程(委托线程)阻塞ms毫秒   
  7.     Thread.Sleep(ms);  
  8.   
  9.     Console.WriteLine("完成!");  
  10.   
  11.     return ++data;  
  12. }  

//定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.WriteLine("开始..."); //当前线程(委托线程)阻塞ms毫秒 Thread.Sleep(ms); Console.WriteLine("完成!"); return ++data; }

 

 

定义一个委托:

[c-sharp] view plain copy print ?
  1. public delegate int TakesAWhileDelegate(int data, int ms);  

public delegate int TakesAWhileDelegate(int data, int ms);

 

 

以下是异步调用委托的3种方式:

1.投票

[c-sharp] view plain copy print ?
  1. /* 异步调用委托之:投票,检查委托是否完成任务 star */  
  2. TakesAWhileDelegate d1 = TakesAWhile;  
  3.   
  4. IAsyncResult ar = d1.BeginInvoke(1, 3000, nullnull);  
  5.   
  6. //检查委托是否完成   
  7. while (!ar.IsCompleted)  
  8. {  
  9.     Console.WriteLine(".");  
  10.   
  11.     //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"."   
  12.     Thread.Sleep(500);  
  13. }  
  14.   
  15. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果   
  16. int result = d1.EndInvoke(ar);  
  17.   
  18. Console.WriteLine("结果:" + result);  
  19. /*   

/* 异步调用委托之:投票,检查委托是否完成任务 star */ TakesAWhileDelegate d1 = TakesAWhile; IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null); //检查委托是否完成 while (!ar.IsCompleted) { Console.WriteLine("."); //当前线程(主线程)阻塞500毫秒,因此最后会打出6个"." Thread.Sleep(500); } //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果 int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); /*

 

2.等待句柄

[c-sharp] view plain copy print ?
  1. /* 异步调用委托之:等待句柄 star */  
  2. TakesAWhileDelegate d1 = TakesAWhile;  
  3.   
  4. IAsyncResult ar = d1.BeginInvoke(1, 3000, nullnull);  
  5.   
  6. while (true)  
  7. {  
  8.     Console.WriteLine(".");  
  9.   
  10.     //AsyncWaitHandle访问等待句柄   
  11.     //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环   
  12.     if (ar.AsyncWaitHandle.WaitOne(500, false))  
  13.     {  
  14.         Console.WriteLine("可获得结果啦Baby!");  
  15.   
  16.         break;  
  17.     }  
  18. }  
  19.   
  20. //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果   
  21. int result = d1.EndInvoke(ar);  
  22.   
  23. Console.WriteLine("结果:" + result);  
  24. /* 异步调用委托之:等待句柄 end */  

/* 异步调用委托之:等待句柄 star */ TakesAWhileDelegate d1 = TakesAWhile; IAsyncResult ar = d1.BeginInvoke(1, 3000, null, null); while (true) { Console.WriteLine("."); //AsyncWaitHandle访问等待句柄 //WaitOne()第一个参数为一超时时间,即要等待的最大时间,超时返回false,继续while循环 if (ar.AsyncWaitHandle.WaitOne(500, false)) { Console.WriteLine("可获得结果啦Baby!"); break; } } //EndInvoke()方法会一直等待,直到委托完成为止,用于接收结果 int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); /* 异步调用委托之:等待句柄 end */

 

3.异步回调

[c-sharp] view plain copy print ?
  1. //定义委托调用完毕后的回调方法   
  2. private static void TakesAWhileCommpleted(IAsyncResult ar)  
  3. {  
  4.     if (ar == null)  
  5.     {  
  6.         throw new ArgumentException("ar");  
  7.     }  
  8.   
  9.     TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate;  
  10.   
  11.     int result = d1.EndInvoke(ar);  
  12.     Console.WriteLine("结果:" + result);  
  13. }  

//定义委托调用完毕后的回调方法 private static void TakesAWhileCommpleted(IAsyncResult ar) { if (ar == null) { throw new ArgumentException("ar"); } TakesAWhileDelegate d1 = ar.AsyncState as TakesAWhileDelegate; int result = d1.EndInvoke(ar); Console.WriteLine("结果:" + result); }

 

[c-sharp] view plain copy print ?
  1. /* 异步调用委托之:异步回调 star */  
  2. TakesAWhileDelegate d1 = TakesAWhile;  
  3.   
  4. d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1);  
  5.   
  6. for (int i = 0; i < 100; i++)  
  7. {  
  8.     Console.WriteLine(".");  
  9.   
  10.     Thread.Sleep(500);  
  11. }  
  12. /* 异步调用委托之:异步回调 end */  

/* 异步调用委托之:异步回调 star */ TakesAWhileDelegate d1 = TakesAWhile; d1.BeginInvoke(1, 3000, TakesAWhileCommpleted, d1); for (int i = 0; i < 100; i++) { Console.WriteLine("."); Thread.Sleep(500); } /* 异步调用委托之:异步回调 end */

 

 

注:异步模式,不仅用于委托,异步模式在.NET Framework的各个地方都能见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值