3、TraceReplay类提供了5个事件,你可以通过提供你自己的event handler来进一步控制重放操作,其中最有用的event是ReplayEvent,它将在每个event被重放之前调用,你可以控制是否跳过该event的重放。
下面的代码在设置了ReplayEvent的处理函数后启动重放。请注意Start函数是同步操作,它将一直阻塞直到重放结束,所以如果你需要在中途停掉的话,你可以在event handler里或者其它线程中调用Stop函数。
replay.ReplayEvent += new ReplayEventHandler(ReplayHandler);
replay.Start();
traceFile.Close();
replay.Start();
traceFile.Close();
4、这里我们的ReplayHandler处理函数将对SPID进行过滤,所有SPID不是54的事件都将被忽略。代码中空的catch是为了避免某些event不含有SPID列会造成读取该列失败。
private static void ReplayHandler(Object sender, ReplayEventArgs args)
{
IDataRecordChanger recordChanger = args.CurrentRecord;
int spid = 0;
try
{
spid = (int)recordChanger["SPID"];
}
catch { }
if (spid != 54)
args.SkipRecord = true;
}
{
IDataRecordChanger recordChanger = args.CurrentRecord;
int spid = 0;
try
{
spid = (int)recordChanger["SPID"];
}
catch { }
if (spid != 54)
args.SkipRecord = true;
}
5、Replay的结果文件可以用Profiler工具打开查看,当然你仍然可以通过TraceFile打开,只要简单的调用InitializeAsReader然后循环调用Read即可,下面的代码将打出TextData列的内容。
TraceFile traceFileOutput = new TraceFile();
traceFileOutput.InitializeAsReader(@"c:\replayoutput.trc");
while (traceFileOutput.Read())
{
Console.WriteLine(traceFileOutput["TextData"]);
}
traceFileOutput.InitializeAsReader(@"c:\replayoutput.trc");
while (traceFileOutput.Read())
{
Console.WriteLine(traceFileOutput["TextData"]);
}