C#同步委托与异步委托学习总结

编程入门 行业动态 更新时间:2024-10-19 21:42:23

C#同步委托与异步委托学习总结

C#同步委托与异步委托学习总结

 同步委托编写以及调用

1. 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在。本章中,我将由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.NET Framework 中的委托和事件、委托中方法异常和超时的处理、委托与异步编程、委托和事件对Observer 设计模式的意义,对它们的编译代码也做了讨论。

定义委托: 委托的定义如下

public delegate int NumberAdd(int x, int y);

定义回调方法:这里定义了两个方法,一个静态,一个实例。正好看看调用方式的不同。注意:定义的回调方法签名必须和委托对象一致(这里都是int 类型参数,没有返回值。这么说也不全对,涉及到协变逆变),这是因为将方法绑定到委托时,编译器会检测他们的兼容性。不符合的话回报编译错误。就比如有一个方法要传入int类型,我们给它传递了一个int类型一样。

 public int SumNumber(int x, int y){return x + y;}public int DecareNum(int i,int j){return i * j;}

 同步委托的调用执行:

    NumberAdd numberAdd = new NumberAdd(SumNumber);var flag = numberAdd.Invoke(2, 4);Console.WriteLine("同步执行返回结果为" + flag + "----" + ttt);

 

 

 异步委托的编写以及调用

同样我们使用以上定义的回到方法,通过关键词 IAsyncResult 来进行异步回调使用

 Console.WriteLine("主线程 (id: {0}) 调用 NumberAdd方法", Thread.CurrentThread.ManagedThreadId);IAsyncResult async = numberAdd.BeginInvoke(4, 5, null, null);for (int i = 0; i < 5; i++)Console.WriteLine("......");Console.WriteLine("主线程等待 (id: {0}) EndInvoke", Thread.CurrentThread.ManagedThreadId);int result = numberAdd.EndInvoke(async);Console.WriteLine("主线程执行完毕,取得结果: {0}", result);
 var ss = async1.CompletedSynchronously; //获取异步操作是否同步完成

也可以通过一下方式进行异步回调 

///使用waitone()
IAsyncResult async2 = numberAdd.BeginInvoke(11, 22, null, null);
while (!async2.AsyncWaitHandle.WaitOne(500))
{var tt = async2.AsyncState;Console.WriteLine("........" + tt);Thread.Sleep(0);
}
var resu1 = numberAdd.EndInvoke(async2);
Console.WriteLine("get the value:{0}", resu1);
 var kk = async3.AsyncState;//获取异步执行的操作状态

 

 

 使用异步回调函数 IAsyncResult   进行回调函数调用

IAsyncResult async3 = numberAdd.BeginInvoke(7, 9, NumberAddCompleted, "开启主线程打印消息");for (int i = 0; i < 5; i++){var kk = async3.AsyncState;Console.WriteLine("........" + kk);}
 public static void NumberAddCompleted(IAsyncResult async){Console.WriteLine("主线程方法运行完毕, 调用回调函数");AsyncResult async1 =(AsyncResult)async;Console.WriteLine(async1.AsyncState as string);//通过AsyncResult类型实例获取委托实例NumberAdd numberAdd = (NumberAdd)async1.AsyncDelegate;//NumberDec add = (NumberDec)async1.AsyncDelegate;var result = numberAdd.EndInvoke(async1);Console.WriteLine("get the value:{0}", result);}

C#中自定义委托Action<>与Func<> 

 Action<>  是系统内置(或者说预定义)的一个委托类型,它可以指向一个没有返回值且没有参数的方法。

 Func<> 也是c#内置的委托类型,不同的是, Func<> 只能用来引用具有返回值的方法,也就是说,在使用它时,至少需要在尖括号内指定一种类型,当仅指定一种类型时,表示引用具有返回值但没有参数的方法,当指定多种类型时,其中最后一个类型表示返回值类型,前面的表示所引用方法的参数列表的类型。

        public class Mytest{public double Mymethod1(int i, int j){return i * j;}public  void Mymethod2(int i, int j){Console.WriteLine("无返回值");}Action<int,int> action = new Mytest().Mymethod2;Func<int,int, double> func = new Mytest().Mymethod1;}

 

 

 以上为个人委托学习总结,如有不正之处,欢迎斧正,记得三连哦!

更多推荐

C#同步委托与异步委托学习总结

本文发布于:2024-03-14 18:41:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1737100.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!