• 【C#】回调方法不通过object参数获得委托实例


    回调方法中几乎都会存在获取委托实例的需求,进而通过委托实例调用EndInvoke以得到异步执行的返回值。在我看过的相关文章中,获取委托实例的方法几乎都是同一个,就是向BeginInvoke的最后一个参数(object型)传入委托实例,然后在回调方法中通过ar.AsyncState得到,甚至在《C#高级编程》一书中,还特地讲到最后这个object参数最适合传入委托实例本身,以便回调方法中获取到它。直到看了张子阳的《.Net之美》一书后(似有广告之嫌,但事实如此,我也就不避讳了),新学到一招,不需要传参,直接就能从ar得到委托实例。如下:

        ......
        DemoDelegate del = DemoMethod;
        del.BeginInvoke(CallBackMethod, del);//向最后一个参数传入委托实例本身
        
    Console.ReadKey(); }
    //回调方法 public static void CallBackMethod(IAsyncResult ar) { object a = ar.AsyncState; //常见方法 object b = ((AsyncResult)ar).AsyncDelegate; //新方法 Console.WriteLine(a != null && a == b); //输出true,说明新方法靠谱 } public delegate void DemoDelegate(); public static void DemoMethod() { }

    即把ar强转为AsyncResult类型后,就可以通过属性AsyncDelegate得到委托实例。这样一来,原本那个object参数就可以腾出来挪作它用,所以掌握这个新方法我认为还是有意义的。其中这个AsyncResult类有必要说明一下,在:

    命名空间:System.Runtime.Remoting.Messaging
    程序集:mscorlib.dll

    文档:http://msdn.microsoft.com/zh-cn/library/System.Runtime.Remoting.Messaging.AsyncResult(v=vs.80).aspx

    按我理解这个AsyncResult类应该是较为公共基础的一个类,但为什么MS把它归纳在这么一个较为偏僻的命名空间中不得而知,大概也可能正因为如此,通过AsyncResult.AsyncDelegate得到委托实例这个方法才不常见吧。

  • 相关阅读:
    v-bind绑定属性
    vue 第二次学习笔记 v-once v-html
    P4428-[BJOI2018]二进制【树状数组,set】
    P5180-[模板]支配树
    《架构之美》阅读笔记一
    Python基础04----条件控制
    Tensorflow2.0笔记33——Keras 来搭建神经网络的“八股”套路
    每周总结
    架构漫谈阅读笔记01
    Tensorflow2.0笔记32——卷积神经网络
  • 原文地址:https://www.cnblogs.com/ahdung/p/3588256.html
Copyright © 2020-2023  润新知