C# Postsharp AOP方法异步拦截方面

C# Postsharp AOP方法异步拦截方面,c#,async-await,postsharp,method-interception,C#,Async Await,Postsharp,Method Interception,在我的winform程序中,我在每个控件事件上使用Postsharp拦截器类,以避免try/catch块重复 自定义postsharp方法: [Serializable] public class OnErrorShowMessageBox : MethodInterceptionAspect { public override void OnInvoke(MethodInterceptionArgs args) { try {

在我的winform程序中,我在每个控件事件上使用Postsharp拦截器类,以避免try/catch块重复

自定义postsharp方法:

[Serializable]
public class OnErrorShowMessageBox : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        try
        {               
            args.Proceed();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            args.ReturnValue = null;
        }
    }
}
使用此属性:

    [OnErrorShowMessageBox]
    private void txtComments_TextChanged(object sender, EventArgs e)
    {
       //blabla
    }
这就像一个魅力,但我知道我想使用异步的事件。因此,txtComments\u textChanged变为:

    [OnErrorShowMessageBox]
    private async void txtComments_TextChanged(object sender, EventArgs e)
    {
        await //blabla
    }
问题来了。侦听器方法中的Try/catch bloc在异步时不捕获任何内容。。。 我该怎么办?
首先,如果您需要一个方面来处理异常,那么通常最好将其作为或来实现。在
OnException
方法中,可以设置
args.FlowBehavior
以防止引发异常

除了提供更好的性能外,还可以通过将
ApplyToStateMachine
属性设置为
true
来实现这些方面。不过有一个警告——对于状态机,不可能更改异常流行为。您仍然可以处理该异常,但不能阻止它被抛出

更新。从PostSharp 5.0开始,可以更改异步方法的流行为

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}
如果方面不应用于异步方法,则可以显示消息框并忽略异常,如以下示例所示

更新。从PostSharp 5.0开始,以下示例也适用于异步方法

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}

首先,如果您需要一个方面来处理异常,那么通常最好将其实现为或。在
OnException
方法中,可以设置
args.FlowBehavior
以防止引发异常

除了提供更好的性能外,还可以通过将
ApplyToStateMachine
属性设置为
true
来实现这些方面。不过有一个警告——对于状态机,不可能更改异常流行为。您仍然可以处理该异常,但不能阻止它被抛出

更新。从PostSharp 5.0开始,可以更改异步方法的流行为

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}
如果方面不应用于异步方法,则可以显示消息框并忽略异常,如以下示例所示

更新。从PostSharp 5.0开始,以下示例也适用于异步方法

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}

首先,如果您需要一个方面来处理异常,那么通常最好将其实现为或。在
OnException
方法中,可以设置
args.FlowBehavior
以防止引发异常

除了提供更好的性能外,还可以通过将
ApplyToStateMachine
属性设置为
true
来实现这些方面。不过有一个警告——对于状态机,不可能更改异常流行为。您仍然可以处理该异常,但不能阻止它被抛出

更新。从PostSharp 5.0开始,可以更改异步方法的流行为

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}
如果方面不应用于异步方法,则可以显示消息框并忽略异常,如以下示例所示

更新。从PostSharp 5.0开始,以下示例也适用于异步方法

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}

首先,如果您需要一个方面来处理异常,那么通常最好将其实现为或。在
OnException
方法中,可以设置
args.FlowBehavior
以防止引发异常

除了提供更好的性能外,还可以通过将
ApplyToStateMachine
属性设置为
true
来实现这些方面。不过有一个警告——对于状态机,不可能更改异常流行为。您仍然可以处理该异常,但不能阻止它被抛出

更新。从PostSharp 5.0开始,可以更改异步方法的流行为

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}
如果方面不应用于异步方法,则可以显示消息框并忽略异常,如以下示例所示

更新。从PostSharp 5.0开始,以下示例也适用于异步方法

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

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}
[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}


你用的是3.1版吗?@StephenCleary我用的是4.039版。也许你的链接就是答案,但我不知道如何根据你的链接修改我的代码(我是postsharp初学者)thanks@StephenClearystephen,你能帮帮我吗?我不认为你能用
async void
方法做你想做的事情
async void
方法有异常行为(将它们直接发送到当前的
SynchronizationContext
),这将非常难以拦截。@StephenCleary arf该死!谢谢您的时间。您使用的是3.1版吗?@StephenCleary我使用的是4.039版。也许你的链接就是答案,但我不知道如何根据你的链接修改我的代码(我是postsharp初学者)thanks@StephenClearystephen,你能帮帮我吗?我不认为你能用
async void
方法做你想做的事情
async void
方法有异常行为(将它们直接发送到当前的
SynchronizationContext
),这将非常难以拦截。@StephenCleary arf该死!谢谢您的时间。您使用的是3.1版吗?@StephenCleary我使用的是4.039版。也许你的链接就是答案,但我不知道如何根据你的链接修改我的代码(我是postsharp初学者)thanks@StephenClearystephen,你能帮帮我吗?我不认为你能用
async void
方法做你想做的事情
async void
方法具有异常行为(将它们发送到direc