在.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中的设置。
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事件的方法的更多相关文章
- net中使用ETW事件
在.net中使用ETW事件的方法 直到.net4.5,才有了比较便利的操作ETW的方法. 本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官 ...
- JS中手动触发事件的方法
如果大家将一张网页看成一个form的话,大致上就成了一个web form的模型.在win form 下要想手动触发某一个对象的事件是很简单的,只要发送一条消息即可达成.(PostMessage) 但是 ...
- iview中键盘上下左右事件的方法
document.addEventListener('keydown', function(e){ var keyCode = e.keyCode; // Esc slide-up ) { e.pre ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- 实现a标签中的各种点击(onclick)事件的方法
我们常用的在a标签中有点击事件:1. a href="javascript:js_method();"这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题, ...
- C#中combobox 控件属性、事件、方法
一 .combobox 属性.事件.方法公共属性 名称 说明 AccessibilityObject 获取分配给该控件的 AccessibleObject. AccessibleDefaultActi ...
- jquery中交替点击事件toggle方法的使用示例
jquery中交替点击事件toggle方法中有两个参数,分别是要交替执行的事件.如果不传参默认是显示隐藏功能,下面有个不错的示例,感兴趣的朋友可以参考下 复制代码代码如下: $('#clickId‘) ...
- ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序;ASP.NET WebForm和MVC总体请求流程图
ASP.NET中HttpApplication中ProcessRequest方法中运行的事件顺序 1.BeginRequest 開始处理请求 2.AuthenticateRequest 授权验证请求 ...
- C# 中删除控件的事件的方法类
方法一: 代码 /// <summary> /// 删除指定控件的指定事件 /// </summary> /// <param name="control&qu ...
随机推荐
- 简易非阻塞http服务器
说明 需要理解阻塞和非阻塞的区别,特别要注意非阻塞和异步不是一个概念,这个很容易弄错.云盘里面netty的书会讲这几个方面的区别,nodejs深入浅出关于异步编程章节里面 ...
- 分布式版本控制工具:git与Mercurial(zz)
分布式版本控制工具:git与Mercurial [收藏此页] [打印] 作者:cyfdecyf 2007-12-26 内容导航: 第1页 [IT168 技术文档] 说到版本控制工具,很 ...
- regexper-正则表达式检验
https://regexper.com 例如:输入 \s.?\w{1,3}(\d(\W)(#?\d{1..4}))
- springMVC 学习 五 参数传递(包括restful风格)
(一)SpringMVC Controller接受参数的方式 (1) 前端传递的参数,在springMVC的controller中使用基本数据类型或者String 类型进行接受 在前端有一个form表 ...
- CRC在线计算工具
http://www.lammertbies.nl/comm/info/crc-calculation.html
- MySQL open_files_limit相关设置
背景: 数据库链接不上,报错: root@localhost:/var/log/mysql# mysql -uzjy -p -h192.168.1.111 --default-charact ...
- Python10/23--继承/派生
(继承)1. 什么是继承? 在程序中继承是一种新建子类的方式,新创建的类称之为子类\派生类,被继承的类称之为父类\基类\超类 继承描述的是一种遗传关系,子类可以重用父类的属性 2. 为何用继承? 减少 ...
- 查看MySQL语句变量了多少行数据
explain MySQL语句 列如 explain SELECT * FROM 表名 WHERE id=1;
- Tomcat服务器的安装和配置
一.Tomcat下载 可以直接从Apache的网站上下载Tomcat(http://tomcat.apache.org/),进入首页后,在左边Download一栏可选择你要下载的版本,点击便可进入To ...
- 第11章:MongoDB-CRUD操作--文档--查询
①语法 db.collection.find(query, projection) ②参数 query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键.查 ...