使用PostSharp
使用OnEntry
的{{1}}和OnExit
方法使用AOP记录来包装WCF服务调用。
过程:
调用OnMethodBoundaryAspect
,OnEntry()
表示调用的开始存储在属性中,并且在该任务继续进行时方法结束之前启动异步任务。此任务格式化有关日志记录的服务调用的一些信息,可能需要一些时间。这些值作为属性存储在此类中以进行日志记录。
调用
DateTime
,另一个OnExit()
表示存储了呼叫结束。此时,我需要确保DateTime
方法中启动的任务已完成,并且所有属性都已准备好记录到数据库中。
问题是如何确保在OnEntry()
中启动的任务已完成,以便在OnEntry()
中使用?我考虑过设置一个布尔值,OnExit()
然后在为true时结束,但由于某种原因这感觉不对。
以下是我目前为此设置的代码。
while(false) {Thread.Sleep(100);}
答案 0 :(得分:2)
基本上,您需要记住您已启动的Task
,然后您可以致电Wait()
等待它完成:
class LogMethodCallAttribute : OnMethodBoundaryAspect
{
Task task;
... as before ...
public override void OnEntry(MethodExecutionArgs args)
{
...
task = Task.Factory.StartNew(...);
}
public override void OnExit(MethodExecutionArgs args)
{
exitTime = DateTime.Now;
// Wait for the task to have completed...
task.Wait();
// Now you can use the fields
}
}
我个人实际上不只是设置了任务中的字段 - 我会为包含日志记录参数的Task<T>
创建T
任务。然后,您可以在属性中将 only 字段作为任务,并具有:
var loggingParameters = task.Result;
... use the logging parameters