使用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
答案 0 :(得分:0)
如果未指定this.ApplyToStateMachine = true
(明确指定相反),PostSharp将仅将方面应用于方法,并且不会转换状态机。对于IOnStateMachineBoundaryAspect
,这应该是默认值。
这是向后兼容的行为,它只转换async的方法体,而不是状态机。由于状态机的第一部分(直到第一次等待)同步运行,因此当异步方法返回任务时,将在第一次等待时调用OnSuccess。要执行您需要的操作,请指定this.ApplyToStateMachine = true
。
请注意,状态机转换目前不包含在Express版本中,仅在Professional或更高版本中可用。