直到.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中的设置。

 using System;
using System.Diagnostics.Tracing; namespace WindowsFormsApplication2
{ public class MyEventSource : EventSource
{
public static MyEventSource Instance = new MyEventSource(); public void Publish(string name)
{
base.WriteEvent(, name);
}
}
}

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

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位于“事件跟踪会话”中,如下图所示:

触发事件

         /// <summary>
/// 触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
MyEventSource.Instance.Publish("leo");
}

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

小结 

在windows编程中,经常会遇到ETW,尤其是在日志和性能方面,经常可以看到ETW的身影。在接下来的文章中,我会介绍如何订阅IIS产生的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事件的方法的更多相关文章

  1. net中使用ETW事件

    在.net中使用ETW事件的方法   直到.net4.5,才有了比较便利的操作ETW的方法. 本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官 ...

  2. JS中手动触发事件的方法

    如果大家将一张网页看成一个form的话,大致上就成了一个web form的模型.在win form 下要想手动触发某一个对象的事件是很简单的,只要发送一条消息即可达成.(PostMessage) 但是 ...

  3. iview中键盘上下左右事件的方法

    document.addEventListener('keydown', function(e){ var keyCode = e.keyCode; // Esc slide-up ) { e.pre ...

  4. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  5. 实现a标签中的各种点击(onclick)事件的方法

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();"这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题, ...

  6. C#中combobox 控件属性、事件、方法

    一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...

  7. jquery中交替点击事件toggle方法的使用示例

    jquery中交替点击事件toggle方法中有两个参数,分别是要交替执行的事件.如果不传参默认是显示隐藏功能,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: $('#clickId‘) ...

  8. ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序;ASP.NET WebForm和MVC总体请求流程图

    ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序 1.BeginRequest  開始处理请求 2.AuthenticateRequest 授权验证请求 ...

  9. C# 中删除控件的事件的方法类

    方法一: 代码 /// <summary> /// 删除指定控件的指定事件 /// </summary> /// <param name="control&qu ...

随机推荐

  1. Python之路(第六篇)Python全局变量与局部变量、函数多层嵌套、函数递归

    一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 全局变量没有任何缩进,在任何位置都可 ...

  2. servlet 高级知识之Listener

    Listener,顾名思义,监听器.它可以监听客户端的请求.服务端的操作等. 通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionCre ...

  3. HDU 6185(打表代码

    /** @xigua */ #include <cstdio> #include <cmath> #include <iostream> #include < ...

  4. python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)

    不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...

  5. android开发笔记(2)

    我之前完成了SDK的安装,这次需要在eclipse中导入相关的控件. 一.下载ADT 在之前下载的网站上下载相关的ADT的压缩包. 二.在eclipse中进行导入 在eclipse中的Help-> ...

  6. RBAC简介

    1.RBAC 中文名称:基于角色的访问控制 1.1 作用:实现访问控制 1.2 核心:角色 2.英文名称:(Role-Based Access Control) 3.解释:一种思想,根据RBAC思想进 ...

  7. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  8. 2018.10.29 NOIP训练 数据结构(带修改莫队)

    传送门 带修莫队板题. 直接按照经典写法做就行了. 代码

  9. css扩大超链接的点击范围

    给a标签设置display:block后,它会根据盒模型计算a标签的实际大小.这时候,你可以使用hover伪类使a的整个盒模型生效..link a{display:block;padding:2px ...

  10. Elastic serarch 安装

    1.安装 1.1下载最新的 elasticsearch-6.5.4.tar.gz 1.2解压 tar -zxvf elasticsearch-6.5.4.tar.gz 1.3 创建用户 elastic ...