【问题标题】:PostSharp Aspect OnSucess method not being called as expected:PostSharp Aspect OnSucess 方法未按预期调用:
【发布时间】:2014-10-21 22:22:11
【问题描述】:

没有按预期使用异步方法调用 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 - 开始 成功 DoSomething - 结束

预期输出将根据非异步调用: DoSomething - 开始 做某事 - 结束 成功

【问题讨论】:

  • 确保您运行的是 PostSharp 3.1 或更高版本。
  • 应该使用 PostSharp Express 添加

标签: c# postsharp


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢丹尼尔,这就是为什么我可能将 ApplyToStateMachine 设置为 false 的原因,因为我相信最初我没有指定它时会收到一些警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多