【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得到委托实例这个方法才不常见吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小詹同学

【记录帖】(No.004)从零打卡刷Leetcode

小詹一直觉得自己编程能力不强,想在网上刷题,又怕不能坚持。不知道有木有和小伙伴和小詹一样想找个人一起刷题呢?欢迎和小詹一起定期刷leetcode,每周一周五更新...

1352
来自专栏算法修养

C# 编码规范

将面向对象设计,也就是解耦,融入于编码之中。不要硬编码,要让你的代码扩展起来十分方便。

1141
来自专栏不是你的bug

计算机是如何实现加法的

我们除去右下角看其他部分,和或运算结果是完全一致的。再单独看一下右下角,输入都为1时输出为0这不就是与非的操作结果吗。那我们将输入同时给到或门和与非门看下他们的...

3401
来自专栏恰童鞋骚年

《代码的未来》读书笔记:也谈闭包

  原文中使用了C语言的函数对象,这里我们主要从.NET平台来说。在.NET中,委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多...

1042
来自专栏Coding迪斯尼

使用普拉特解析法解析复杂的算术表达式

1752
来自专栏技术/开源

从C#到TypeScript - 高级类型

C# vs TypeScript - 高级类型 上一篇讲了基础类型,基本上用基础类型足够开发了,不过如果要更高效的开发,还是要看下高级类型,这篇和C#共同点并不...

2189
来自专栏武军超python专栏

2018年7月25日python中面向对象编程的练习

今天遇到的新单词: parameter  n参数 IndentationError  n缩进错误 formatting n格式化

4104
来自专栏前端说吧

JS方法 - 字符串处理函数封装汇总 (更新中...)

可返回字符串固定位置的字符的Unicode编码,这个返回值是0-65535之间的整数,如果值<=255时为英文,反之为中文。

1803
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料

从本质上来说, 程序就是一系列有序执行的指令集合。 如何将指令集合组织成可靠可用可信赖的软件(美妙的逻辑之塔), 这是个问题。

1326
来自专栏写代码的海盗

维多利亚的秘密 golang入坑系列

原文在gitbook,字字原创,版权没有,转载随意。 在写本文的前一天,2017维密在上海开始了。 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密。现在的社会...

3588

扫码关注云+社区

领取腾讯云代金券