使用Async方法的Postsharp Aspect

时间:2015-04-07 13:59:26

标签: postsharp

我使用的是PostSharp 4.0的试用版终极版,但这对我不起作用。你能查一下我的代码并提出建议吗。该错误未被记录。如果我把断点没有点击onException方法

这是我为错误处理方面编写的代码

[Serializable] 
public class MyMethodAspectAttribute : OnMethodBoundaryAspect
{
    public MyMethodAspectAttribute()
    {
        this.ApplyToStateMachine = true;
    }

    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.Write("Method Entry");
    }

    public override void OnException(MethodExecutionArgs args)
    {
        Console.Write(args.Exception.Message);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}

这是我实施此方面的课程

public class ErrorMethods
{
    [MyMethodAspect]
    public Task<int> Calculate(int i, int j)
    {
        var task = Task.Factory.StartNew(
            () => i / j);
        return task;
    }
}

这就是我使用此方法的方式

private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var obj = new ErrorMethods();

        var result = await obj.Calculate(1, 0);

        if (null  == result)
        {
            MessageBox.Show("error");
        }
    }

1 个答案:

答案 0 :(得分:0)

示例中的Calculate方法不是异步方法,因此设置ApplyToStateMachine aspect的属性对此方法没有影响。当新创建的任务在后台执行且方面无法捕获它时,抛出异常。

如果将Calculate方法更改为异步方法,则方面可以拦截异步状态机执行,并在异常时调用OnException处理程序。

请注意,设置ReturnValueFlowBehavior不会改变状态机的流量,因此不会吞下异常。

public class ErrorMethods
{
    [MyMethodAspect]
    public async Task<int> Calculate( int i, int j )
    {
        return await Task.Factory.StartNew( () => i / j );
    }
}