AOP之PostSharp6-EventInterceptionAspect(事件异步调用)

    在上几章我们讨论了方法属性字段的aspect,现在我们再来看看事件机制的aspect。和字段,属性location一样,在c#中字段也可以转化为方法名为add,remove的方法处理,所以对于事件的aspect,同样类似于我们的方法。我们先看看EventInterceptionAspect的定义:

aspect类包含我们对于事件aspect所必要的注册,取消,调用的注入。

其参数定义如下:

为我们提供了,ProceedAddHandler,ProceedInvokeHandler,ProceedRemoveHandler的事件处理代理。同样包含来自AdviceArgs的Instance对象。

  对于事件aspect的例子真的不好想,在这里我们只是简单的做个事件变为异步调用的代码作为demo:

[Serializable]
    public class AsynEventAspectAttribute : PostSharp.Aspects.EventInterceptionAspect
    {

        public override void OnInvokeHandler(PostSharp.Aspects.EventInterceptionArgs args)
        {
            var th = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(new Action<object>((obj) =>
                {
                    System.Threading.Thread.Sleep(new Random().Next(1000));
                    try
                    {
                        args.ProceedInvokeHandler();
                    }
                    catch (Exception ex)
                    {

                        args.ProceedRemoveHandler();
                    }
                })));
            th.Start();
        }
    }

 测试代码:

namespace PostSharpDemo 

    public class TestAsyncAspect 
    { 
        [AsynEventAspectAttribute] 
        public event EventHandler SomeEvent = null; 

        public void OnSomeEvent() 
        { 
            if (SomeEvent != null) 
            { 

                SomeEvent(this, EventArgs.Empty); 
            } 
        } 
    } 
}

class Program 
    { 
        static void Main(string[] args) 
        {

TestAsyncAspect pro = new TestAsyncAspect(); 
          for (int i = 0; i < 10; i++) 
          { 
              pro.SomeEvent += new EventHandler(pro_SomeEvent); 
          } 
          pro.OnSomeEvent(); 
    //      pro.SomeEvent -= new EventHandler(pro_SomeEvent); 
          Console.WriteLine("主线程完了!"); 
          Console.Read(); 
      } 

      static void pro_SomeEvent(object sender, EventArgs e) 
      { 
          Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 
      }    

}  

 效果图如下:

附件下载:demo

AOP之PostSharp初见-OnExceptionAspect
AOP之PostSharp2-OnMethodBoundaryAspect
AOP之PostSharp3-MethodInterceptionAspect
AOP之PostSharp4-实现类INotifyPropertyChanged植入
AOP之PostSharp5-LocationInterceptionAspect
AOP之PostSharp6-EventInterceptionAspect
http://www.cnblogs.com/whitewolf/category/312638.html

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2011/12/13/PostSharp6.html

时间: 2024-12-03 17:00:12

AOP之PostSharp6-EventInterceptionAspect(事件异步调用)的相关文章

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

异步调用webservice

     今天学习webservice的异步调用.找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作. 但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法.这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文. 一篇引用自http://book.51cto.com/art/200906/129768.htm,是李天平的.  

.Net组件程序设计之异步调用

说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和 BeginInvoke(), 要想让自己的组件可以被客户端调用或者是异步调用,这样的设计是合理的,这也是组件异步机制当中的一条 (说句题外话--其实大多数知识都隐藏在我们平时经常见到的对象或者是代码里,只不过是没有去细心的发现) 在.NET中首先就会想到使用委托来进行异步调用,关于委托的定义在 委托与事件一文中已经大概的说过了,文中只是对委托进行了 大概的讲解,并没有对委托的使用来说

C# 2.0 匿名方法与 Windows Forms 异步调用

window|异步 C# 2.0 匿名方法大大简化了 Windows Forms 异步调用的实现,我们再也不用手工定义异步委托或者包装类了.例如,在下面的代码示例中,Form1 有一个按钮控件和一个列表控件,在按钮控件的单击事件里,我们新建一个线程,在这个线程中向列表控件添加 10 个项目: public class Form1 : System.Windows.Forms.Form{ private System.Windows.Forms.ListBox listBox1; private

异步调用中的上下文控制Tornado stack context

1. 面临的问题 这里说的"异步调用", 在形式上是指那种"调用函数"里, 需要传入一个"回调函数", 然后调用函数马上就返回. 在这种情况下, 回调函数的异常显然与调用函数的异常是不同的, 并且如果不作特殊处理, 回调函数的异常并不会影响调用函数的表现, 比如下例: # -*- coding: utf-8 -*- import tornado.ioloop IL = tornado.ioloop.IOLoop.instance() def ca

请教: WCF 异步调用方法问题

问题描述 刚接触silverlight异步调用wcf方法,网上查到说:wcf中有一个方法publicstringDoWork(),然后再silverlight中:client.DoWorkCompleted+=newEventHandler<DoWorkCompletedEventArgs>(client_GetUserCompleted);请问为什么我找不到事件中的DoWorkCompletedEventArgs,是vs自动生成的吗?还是需要自己写?谢谢~ 解决方案 解决方案二:http:/

【转】Zookeeper-Watcher机制与异步调用原理

Watcher机制:目的是为ZK客户端操作提供一种类似于异步获得数据的操作.   1)在创建Zookeeper实例时,允许接收一个watcher参数,此参数将会赋值给watchMnanger.defaultWatcher,成为当前客户端的默认Watcher.需要注意此watcher和其他watcher不同,此wather主要是响应"与链接状态转换"有关的事件(比如,"建立链接","链接关闭"等,参见KeeperState).此默认watcher有

Yarn源码分析之事件异步分发器AsyncDispatcher

        AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatcher中之前注册的针对该事件所属事件类型的事件处理器EventHandler来处理.每个事件类型类可能会有多个处理渠道,即多个事件处理器,可以使用一个线程池调度事件.在Yarn的主节点ResourceManager中,就有一个Dispatcher类型的成员变量rmDispatcher,

异步调用什么时候结束

问题描述 刚在研究异步调用问题,有个问题不明请教大家:主要代码为:通过网络发一个信息后,异步接收返回信息.当执行回调函数时,是否可以认为BeginReceive(....)执行结束?EndReceive有什么用?voidSendMessage(){......clientSocket.BeginReceive(recvBytes,0,recvBytes.Length,SocketFlags.None,newAsyncCallback(ReceiveCallBack),null);}voidRec