C#线程通信和异步委托

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一次写关于技术原创····

至于要用到题目说到的这种方法,大概是因为在程序执行一些耗时的操作的时候,为了使得界面上不至于处于卡死状态,就让这些耗时的操作放在一边慢慢执行,并用一些方法来监视这些工作执行的状态。在这个过程中我的主线程可以完成一些其他的工作,这叫磨刀不误砍柴工··嘿嘿

关于异步委托,这里要用到里面的两个方法BeginInvoke 和EndInvoke

BeginInvoke 方法启动异步调用。该方法与您需要异步执行的方法具有相同的参数,还有另外两个可选参数。第一个参数是一个AsyncCallback 委托,该委托引用在异步调用完成时要调用的方法。第二个参数是一个用户定义的对象,该对象将信息传递到回调方法。BeginInvoke 立即返回,不等待异步调用完成。BeginInvoke 返回一个IAsyncResult,后者可用于监视异步调用的进度。

用代码讲解貌似简单一点·来一个三国·长坂坡

[csharp]view plaincopy

1.class Program

2. {

3.

4.#region 三国·长板坡

5.//定义一个委托类型

6.public delegate int TaskDelegate(object obj, int ms);

7.

8.

9.//定义一个静态方法看这个方法的开头就知道,大概是委托将要调用的方法

10.public static int ForFun(object obj, int ms)

11. {

12. Thread t = Thread.CurrentThread;

13. = "张飞";

14. Console.WriteLine("我有{0}在手,谁敢与我{1}大战三百回合

", obj.ToString(), );

15. Thread.Sleep(ms);

16.return 1234;

17. }

18.

19.//主线程入口,这个也是我们的主要战场

20.static void Main(string[] args)

21. {

22. Thread t1 = Thread.CurrentThread;

23. = "长坂坡";

24.

25.

26.//主公的任务

27. Console.WriteLine("赶紧去{0}把赵子龙和阿斗救回来", );

28.

29.

30.//为刚才委托指定方法,这里注意方法只需要提供方法名字就可以

31. TaskDelegate t = ForFun;

32.//使用委托的BeginIvoke方法为所委托耳方法赋值,并将执行结果交给

IAsysResult接口

33. IAsyncResult ir = t.BeginInvoke("青釭剑

", 1000 * new Random().Next(5), null, null);//new Random().Next(5) 返回一个小于所指定最大值的非负随机数

34.//上面这个函数除了最后两个参数之前的参数都是那个委托方法需要的参数

35.

36.//曹操的军队比想象中快

37. Thread.Sleep(2000);

38.int i = 0;//计数器

39.

40.// 如果委托还没有执行完就开始循环

41.while (!ir.IsCompleted)

42. {

43. i++;

44. Console.WriteLine(i.ToString());

45. Thread.Sleep(100);

46. }

47.//获取委托方法执行以后的返回值

48.int result = t.EndInvoke(ir);

49.

50. Console.WriteLine("报告主公,曹军杀来,我奋力拼杀,斩敌{0}人

", i.ToString());

51.

52.if (i > 1)

53. {

54. Console.WriteLine("辛苦飞哥了,你杀敌{0}人,应该奖励黄金{1}两

", i.ToString(), (i * 100).ToString());

55.

56. }

57.else

58. {

59. Console.WriteLine("既然是未有杀敌,那今天就不奖励你啦");

60. }

61. Console.Read();

62. }

1用IAsyncResult中的IsCompleted 属性进行轮询判断是否完成

2 BeginInvoke()的函数声明:

public IAsyncResult BeginInvoke(

<输入和输出变量>,回调函数callback , 附加信息AsyncState)

3 函数返回值类型:

public interface IAsyncResult

{

object AsyncState{ get;} //如果有回调函数的话该参数用于保存要传递给回调函数的参数值

WaitHandle AsyncWaitHandle{ get;}

bool CompletedSynchronously{ get;}

bool IsCompleted{ get;} //保存方法是否执行结束,我们可以通过该属性的值来判断异步方法是否执行结束

相关文档
最新文档