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
net中使用ETW事件的更多相关文章
- 在.net中使用ETW事件的方法
直到.net4.5,才有了比较便利的操作ETW的方法. 本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官方资料库. 准备 (1)需要用到类:M ...
- 深刻理解:C#中的委托、事件
C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 关于ios苹果系统的中的右键事件,查遍了全网都没有的小技巧。
前阵子公司要求写一套手机端,兼容各种平台和系统,当然,pc端也没有放过. 我用了bootstrap框架和jq.在安卓中的右键事件只需要取消浏览器默认事件,然后长按就可以触发pc端的右键事件,非常好,一 ...
- vlc 在ie11 中的addEventListener事件不触发
在vlc控件中触发一事件,在IE11之前的版本使用attachEvent注册一个回调函数后IE11可以捕获到事件,但IE11中提示attachEvent不支持.经查询发现IE11已经去掉了attach ...
- 如果正确读取SQL Server中的扩展事件?
SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...
- C#中WinForm窗体事件的执行次序
C#中WinForm窗体事件的执行次序如下: 当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件: System.Windows.Forms.Control ...
随机推荐
- 利用h5标签在网页上播放音乐
方案1: <embed src="等一分钟.mp3" id="aa"> <input type=button value=暂停 onclick ...
- 用XAML做网页!!—终结篇
原文:用XAML做网页!!-终结篇 迄今为止的设计都很顺利,但这次就不得不接触我前面所说的非常糟糕的流文档了,但在此之前先来把标题弄好: <Border BorderBrush="#6 ...
- PHP 字符串正则替换函数preg_replace使用说明
1. preg_replace() $msg = preg_replace("/<style>.+<\/style>/is", "", ...
- 关于QTP
关于QTP,我也才接触,只是上来记录一下安装过程,免得以后忘记,又要查一堆资料. 简单介绍一下QTP: QTP的基本功能包括2个部分:一部分是提供给初级用户使用的关键字视图:另一部分是提供给熟悉VBS ...
- Kinect的学习笔记发展(一)Kinect引进和应用
Kinect的学习笔记发展(一)Kinect引进和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- MVC 学习 区域
http://www.cnblogs.com/fly_dragon/archive/2011/10/12/2209438.html
- 教你如何使用U盘装系统
首先,你必须有一个4G以上U菜,然后,U光盘制作软件(这里我们使用url=KRVS0FUdaNAMKPUXUxjEijxBMalUjaJHph-tL-x4gXGSwVNUW3fj6RfuZtrMg1Y ...
- C++写一个简单的解析器(分析C语言)
该方案实现了一个分析C语言的词法分析+解析. 注意: 1.简单语法,部分秕.它可以在本文法的基础上进行扩展,此过程使用自上而下LL(1)语法. 2.自己主动能达到求First 集和 Follow 集. ...
- SICP的一些个人看法
网上搜书的时候,看到非常多人将这本书神话. 坦率地说,个人认为这本书过于学术化, 没什么实际project价值.一大堆题目也基本是高中数学竞赛题类似,浪费时间. 软件的核心技术是什么? 1> ...
- MySql语句大全:创建、授权、查询、修改等(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.用户创建.权限.删除 1.连接MySql操作 连接:mysql -h 主机地址 -u 用户 ...