PostSharp Aspect OnSucess方法未按预期调用:

时间:2014-10-21 11:11:02

标签: c# postsharp

使用Async方法未按预期调用PostSharp Aspect OnSuccess方法。 当我等待Async方法时,成功是在方法返回之前调用。 我的看点:

namespace PostSharpConcepts
{
    [Serializable]
    public class ProfilerAspect : OnMethodBoundaryAspect, IOnStateMachineBoundaryAspect
    {
        public ProfilerAspect()
        {
            ApplyToStateMachine = false;
        }

        public override void OnEntry(MethodExecutionArgs args)
        {
            args.MethodExecutionTag = Stopwatch.StartNew();
        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            Stopwatch sw = (Stopwatch) args.MethodExecutionTag;
            sw.Stop();
            string message = string.Format("{0} Executed in {1} seconds, Class : {2}", args.Method.Name, (float)sw.ElapsedMilliseconds / 1000, args.Method.DeclaringType.FullName);
            Debug.WriteLine("OnSuccess");
            Logger.LogBase(Logger.LogLevel.Debug, message);
        }

        public override void OnResume(MethodExecutionArgs args)
        {
            Stopwatch sw = (Stopwatch)args.MethodExecutionTag;
            sw.Stop();
            string message = string.Format("{0} Executed in {1} seconds, Class : {2}", args.Method.Name, (float)sw.ElapsedMilliseconds / 1000, args.Method.DeclaringType.FullName);
            Debug.WriteLine("OnResume");
            Logger.LogBase(Logger.LogLevel.Debug, message);
        }
    }
}

致电代码:

namespace PostSharpConcepts
{
    [ProfilerAspect]
    class Program
    {
        static void Main(string[] args)
        {
            DoSomething();
            Console.ReadLine();
        }

        private async static void DoSomething()
        {
            Debug.WriteLine("DoSomething - start");
            await Task.Run(() => System.Threading.Thread.Sleep(2000));
            Debug.WriteLine("DoSomething - end");
        }
    }
}

这是输出: DoSomething - 开始 的onSuccess DoSomething - 结束

预期输出将按照非异步调用: DoSomething - 开始 DoSomething - 结束 的onSuccess

1 个答案:

答案 0 :(得分:0)

如果未指定this.ApplyToStateMachine = true(明确指定相反),PostSharp将仅将方面应用于方法,并且不会转换状态机。对于IOnStateMachineBoundaryAspect,这应该是默认值。

这是向后兼容的行为,它只转换async的方法体,而不是状态机。由于状态机的第一部分(直到第一次等待)同步运行,因此当异步方法返回任务时,将在第一次等待时调用OnSuccess。要执行您需要的操作,请指定this.ApplyToStateMachine = true

请注意,状态机转换目前不包含在Express版本中,仅在Professional或更高版本中可用。