net中使用ETW事件

在.net中使用ETW事件的方法

直到.net4.5,才有了比较便利的操作ETW的方法。

本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官方资料库。

准备

(1)需要用到类:Microsoft TraceEvent Library,这个类可以到nuget上下载到:

Install-Package Microsoft.Diagnostics.Tracing.TraceEvent

(2).net framework的版本要求在4.5以上

概念

图中有三个角色:

(1)Event Session(事件会话)。事件提供者需要向控制器提交事件数据的元数据,控制器会将事件数据的元数据提供给事件消费者。它还可以控制是否接受事件提供者的事件提交。它对应Microsoft.Diagnostics.Tracing.TraceEventSession类。

(2)Event Provider(事件提供者),作用是引发事件,提供事件数据。它对应Microsoft.Diagnostics.Tracing.EventSource 类。

(3)Event Consumer(事件消费者),作用是消费事件。它对应Microsoft.Diagnostics.Tracing.TraceEventSource类。

创建ETW事件源(事件提供者)

创建一个继承自EventSouce接口的类。注意类中成员方法Publish调用了基类的WriteEvent()方法,WriteEvent()多达13个的重载,这里选择比较简单的一个方法。如其字面所示,它的作用是将Event data(事件数据)写入事件,如上图所示。至于写入的Event data是被保存在磁盘上,还是保存在内存中,取决于后续的session中的设置。

 1 using System;
 2 using System.Diagnostics.Tracing;
 3
 4 namespace WindowsFormsApplication2
 5 {
 6
 7     public class MyEventSource : EventSource
 8     {
 9         public static MyEventSource Instance = new MyEventSource();
10
11         public void Publish(string name)
12         {
13             base.WriteEvent(1, name);
14         }
15     }
16 }

创建会话,绑定事件源(事件提供者),订阅事件源(事件消费者)

using Microsoft.Diagnostics.Tracing.Session;
using Microsoft.Diagnostics.Tracing;

        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(delegate
            {
                using (var session = new TraceEventSession("MySession"))
                {
                    session.EnableProvider("MyEventSource"); // 使能事件源(事件提供者)

                    session.Source.Dynamic.All += Dynamic_All;  // 注册事件处理函数(事件消费者)

                    session.Source.Process();  // 等待事件产生
                }
            }));
            thread.Start();
        }

        /// <summary>
        /// 事件处理函数
        /// </summary>
        /// <param name="obj"></param>
        void Dynamic_All(TraceEvent obj)
        {
            Console.WriteLine("event data" + obj.ToString());
        }

细心的读者可能会发现,在上面提到的三个角色中,事件消费者似乎没有出现。实际上,它出现了,session.Source返回的是一个ETWTraceEventSource对象。ETWTraceEventSource继承自TraceEventSource,就是事件消费者。

在会话被创建之后,在windows的性能监视器(控制面板=》管理工具)中,可以看到MySession位于“事件跟踪会话”中,如下图所示:

触发事件

1         /// <summary>
2         /// 触发事件
3         /// </summary>
4         /// <param name="sender"></param>
5         /// <param name="e"></param>
6         private void button2_Click(object sender, EventArgs e)
7         {
8             MyEventSource.Instance.Publish("leo");
9         }

在执行这个方法之后,系统会调用上面所注册的事件处理函数Dynamic_All(),且将事件数据"leo"一起传入了,如下图所示:

小结 

在windows编程中,经常会遇到ETW,尤其是在日志和性能方面,经常可以看到ETW的身影。在接下来的文章中,我会介绍如何订阅IIS产生的ETW事件。

参考资料

Microsoft.Diagnostics.Tracing.TraceEvent

An End-To-End ETW Tracing Example: EventSource and TraceEvent

Application Analysis with Event Tracing for Windows (ETW)

分类: .net进阶

标签: ETW事件

时间: 2024-10-05 05:00:18

net中使用ETW事件的相关文章

网站开发div在Jquery中的鼠标事件失去焦点

网站div在Jquery中的鼠标事件失去焦点,今天在做网站开发的时候遇到了个问题,就是我在用Jquery做导航的时候,用到了Jquery的鼠标事件mouseout,但问题出来了,我有两个div,A的div包含了B的div,本来我是想当鼠标移出A的div的时候隐藏div,可是当我的鼠标移到B的div在移出的时候也会触发jquery的隐藏事件,这让人很头痛. 在网上搜了下,找到了解决的法子,就是直接把mouseout换成了mouseleave就可以了,具体的问题请大家参考Jquery的开发文档吧

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

C# 中的委托和事件

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委 托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续) 引言 委托 和 事件在

C#中的委托和事件(续)

C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因.主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该

(转)C# 中的委托和事件

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

android中根据touch事件判断单击及双击

private static final int MAX_INTERVAL_FOR_CLICK = 250;     private static final int MAX_DISTANCE_FOR_CLICK = 100;     private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;     int mDownX = 0;     int mDownY = 0;     int mTempX = 0;     int mTempY

C#中的委托与事件并存的理由

问题 有了委托为什么还要有事件? 理论上,事件能完成的事情委托完全可以胜任,但是我们思考的这一方面是功能性,我们必须从他们各自的特点分析. 委托链的特点让事件能够被多个订阅方订阅,事件是带上了event关键字的委托,在用reflector反编译事件源码时,我 们看到事件成员的可访问性被始终设置为private,其订阅和移除事件靠方法来完成. 所以,他们的区别出现了: 委托可被任意调用者修改,甚至抹去所有的委托连,而对于事件,只能由订阅者自己决定订阅或者移除事件. 事件的密封性较好,他从本质层面上

javascript中常用的事件绑定方法

我们要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTML标签.JavaScript支持在标签中直接绑定事件,语法为:    onXXX="JavaScript Code" 其中

js中的Dom事件模型以及表格方面等内容

1.实现评论页面的制作 <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #outside{ width: 1000px; margin: 0 auto; border: 1px solid #E7EAEE; overflow: hidden; pad