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;
        }

 

 

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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值