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#同步委托与异步委托学习总结
发布评论