这一部分主要是结合自定义活动介绍一下在工作流如何使用跟踪Trace,在工作流中进行代码跟踪有两种方式:
1、使用System.Diagnostics.Trace类
2、使用System.Activities.Tracking.CustomTrackingRecord对象
我们先看看简单一点的,使用System.Diagnostics.Trace类进行跟踪,先上代码:
switch (Level)
{
//输出错误处理消息
case System.Diagnostics.TraceLevel.Error:
//使用指定的消息向 System.Diagnostics.Trace.Listeners 集合中的跟踪侦听器中写入错误消息
System.Diagnostics.Trace.TraceError(text);
break;
//输出信息性消息、警告和错误处理消息
case System.Diagnostics.TraceLevel.Info:
//使用指定的消息向 System.Diagnostics.Trace.Listeners 集合中的跟踪侦听器中写入信息性消息
Trace.TraceInformation(text);
break;
case System.Diagnostics.TraceLevel.Verbose:
//将类别名称和消息写入 System.Diagnostics.Trace.Listeners 集合中的跟踪侦听器。
Trace.WriteLine(text, Category);
break;
case System.Diagnostics.TraceLevel.Warning:
//使用指定的消息向 System.Diagnostics.Trace.Listeners 集合中的跟踪侦听器中写入警告消息
Trace.TraceWarning(text);
break;
}
这是DiagnosticTrace.cs中的一段代码,从中我们可以看到Trace类为我们提供了四个方法,分别是写入错误消息,警告消息,信息性消息或自定义消息(类别名称及消息本身),大家会注意到在代码中的注释我们四次提到了System.Diagnostics.Trace.Listeners 集合,这个Listeners集合就是跟踪消息监听器,它的主要功能就是为监视跟踪和调试输出。只要Trace写需要写入新消息,就会将信息写入Listeners集合中的侦听器,下面我们以WriteLine方法为例,看看Trace的执行过程
[Conditional("TRACE")]
public static void WriteLine(string message, string category)
{
TraceInternal.WriteLine(message, category);
}
public static void WriteLine(string message, string category)
{
if (UseGlobalLock)
{
lock (critSec)
{
foreach (TraceListener listener in Listeners)
{
listener.WriteLine(message, category);
if (AutoFlush)
{
listener.Flush();
}
}
return;