等待异步方法从单独的方法完成

时间:2014-01-30 20:47:12

标签: c# wcf asynchronous postsharp

使用PostSharp使用OnEntry的{​​{1}}和OnExit方法使用AOP记录来包装WCF服务调用。

  

过程:
  调用OnMethodBoundaryAspectOnEntry()表示调用的开始存储在属性中,并且在该任务继续进行时方法结束之前启动异步任务。

     

此任务格式化有关日志记录的服务调用的一些信息,可能需要一些时间。这些值作为属性存储在此类中以进行日志记录。

     调用

DateTime,另一个OnExit()表示存储了呼叫结束。此时,我需要确保DateTime方法中启动的任务已完成,并且所有属性都已准备好记录到数据库中。

问题是如何确保在OnEntry()中启动的任务已完成,以便在OnEntry()中使用?我考虑过设置一个布尔值,OnExit()然后在为true时结束,但由于某种原因这感觉不对。

以下是我目前为此设置的代码。

while(false) {Thread.Sleep(100);}

1 个答案:

答案 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