c# – 如何在通用应用程序中禁用任务并行库的ETW事件源?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何在通用应用程序中禁用任务并行库的ETW事件源?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2285字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何在通用应用程序中禁用任务并行库的ETW事件源?](/upload/InfoBanner/zyjiaocheng/772/690e1f4bf63c49c990d2be01068485a7.jpg)
任务并行库使用Event Tracing for Windows (ETW)进行日志记录.显然,在Windows Phone或Windows Store .NET Runtime下,存在与TPL或ETW中的日志记录相关的错误.原始问题描述于here.
一种可能的解决方法是禁用TPL的ETW EventSource.
如果我真的想要如何在通用Windows应用程序中禁用它?
反射适用于桌面应用程序,但不适用于WP / WinRT应用程序. EventCommand.Disable未被识别为EventSource.SendCommand的有效命令(尽管它在ETW内部使用).这是要使用的代码(作为控制台应用程序):
using System;
using System.Threading.Tasks;
using System.Diagnostics.Tracing;
using System.Reflection;
namespace ConsoleApplication
{
class Program
{
internal class MyEventListener : EventListener
{
protected override void OnEventSourceCreated(EventSource eventSource)
{
Console.WriteLine(eventSource);
base.OnEventSourceCreated(eventSource);
if (eventSource.Name == "System.Threading.Tasks.TplEventSource")
{
Console.WriteLine("enabled: " + eventSource.IsEnabled());
// trying to disable with EventCommand.Disable: Invalid command
try
{
System.Diagnostics.Tracing.EventSource.SendCommand(
eventSource, EventCommand.Disable,
new System.Collections.Generic.Dictionary<string, string>());
Console.WriteLine("enabled: " + eventSource.IsEnabled());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
// reflection: doesn't work for Windows Phone/Store apps
try
{
var ti = typeof(EventSource).GetTypeInfo();
var f = ti.GetDeclaredField("m_eventSourceEnabled");
f.SetValue(eventSource, false);
Console.WriteLine("enabled: " + eventSource.IsEnabled());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
Console.WriteLine(eventData);
}
}
static MyEventListener listener = new MyEventListener();
static void Main(string[] args)
{
Task.Delay(1000).Wait();
Console.ReadLine();
}
}
}
对于通用应用程序,可以将MyEventListener实例化为Application的一部分:
public sealed partial class App : Application
{
static MyEventListener listener = new MyEventListener();
}
解决方法:
我遇到了类似的问题并找到了一个潜在的解决方案.
您只需在EventSource上调用Dispose()即可!
这不会删除事件源,但会禁用它.并且它们都继承自的基本EventSource确实具有适当的检查,以防止在被禁用时调用其余的继承类.所以,从理论上讲,它应该是安全的.但是可能有一些EventSource实现,这将无法正常工作,所以要彻底测试它!
有关EventSource.Dispose(bool disposing)实现,请参见here.
内容总结
以上是互联网集市为您收集整理的c# – 如何在通用应用程序中禁用任务并行库的ETW事件源?全部内容,希望文章能够帮你解决c# – 如何在通用应用程序中禁用任务并行库的ETW事件源?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。