我正在编写一个非常简单的实用程序类,目的是测量传入的任何方法(任何类型)执行的时间.
在我的情况下Membership.ValidateUser(model.UserName, model.Password)返回bool所以我得到一个例外.
我想如果有可能写一个这种类型的utililty类的代码示例如何解决它.是否有意义使用动态代替行动?
Tracing.Log(Membership.ValidateUser(model.UserName, model.Password), "Membership.ValidateUser");
Run Code Online (Sandbox Code Playgroud)
public static class Tracing
{
public static void Log(Action action, string message)
{
// Default details for the Log
string sSource = "TRACE";
string sLog = "Application";
// Create the Log
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
// Measure time Elapsed for an Action
Stopwatch stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
TimeSpan timeElapsed = stopwatch.Elapsed;
// Write the Log
EventLog.WriteEntry(sSource, "TIME-ELAPSED: " + timeElapsed .ToString() + message, EventLogEntryType.Warning, 234);
}
}
Run Code Online (Sandbox Code Playgroud)
您当前的代码尝试执行ValidateUser并将结果用作方法参数.您希望在不先执行的情况下传递操作ValidateUser.
您只需要转换方法调用以使用lambda表达式来创建委托:
Tracing.Log(() => Membership.ValidateUser(model.UserName, model.Password),
"Membership.ValidateUser");
Run Code Online (Sandbox Code Playgroud)
(动态类型根本不会影响这一点.)
请注意,单个方法执行的计时通常会给您带来非常嘈杂的结果,除非它是一个相当长的方法调用.通常要对您希望多次执行该方法的单个方法进行基准测试,直到您花费相当多的时间执行该方法.使用Stopwatch帮助,但它没有超越你的方法可能需要很少的滴答来完成的事实,并且如果线程被抢先,那将对结果产生不成比例的影响.
编辑:我假设您想纯粹用于基准测试.如果您尝试在实际应用程序中执行此跟踪,则需要采用创新性较低的方法.以Mini-MVC-Profiler为例.
| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |