AhDung

/*追求代码质量的野生码农*/

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

回调方法中几乎都会存在获取委托实例的需求,进而通过委托实例调用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得到委托实例这个方法才不常见吧。

posted on 2014-03-08 17:22  ahdung  阅读(1148)  评论(0编辑  收藏  举报