2015-03-25 4 views
0

В моей программе winform я использую класс перехватчиков Postsharp для каждого события управления, чтобы избежать повторения повторения попыток/catch.Postsharp AOP MethodInterception Aspect с async

Обычай метод 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; 
     } 
    } 
} 

Использование этого attributs:

[OnErrorShowMessageBox] 
    private void txtComments_TextChanged(object sender, EventArgs e) 
    { 
     //blabla 
    } 

Это работает как шарм, но знаю, я хотел бы использовать асинхр на мероприятии. Так txtComments_textChanged станет:

[OnErrorShowMessageBox] 
    private async void txtComments_TextChanged(object sender, EventArgs e) 
    { 
     await //blabla 
    } 

И вот проблема. Try/catch bloc в методе перехватчика ничего не поймать, когда асинхронно ... Как я могу это сделать? спасибо

+1

Вы используете версию 3.1, которая [добавлена ​​поддержка для 'методов async'] (http://www.postsharp.net/blog/post/New-in-PostSharp-31-Support-for-async и-итератор-метода)? –

+0

@ StephenCleary Я использую версию 4.039. Может быть, ваша ссылка - ответ, но я не вижу, как мне изменить свой код по вашей ссылке (я начинаю postsharp beginner) спасибо – Julian50

+0

@StephenCleary Пожалуйста, помогите мне, помогите? – Julian50

ответ

3

Прежде всего, если вам нужен аспект для обработки исключений, тогда обычно лучше реализовать его как OnMethodBoundaryAspect или OnExceptionAspect. В вашем методе OnException вы можете установить args.FlowBehavior на номер FlowBehavior.Return or FlowBehavior.Continue, чтобы предотвратить исключение исключения.

В дополнение к обеспечению лучшей производительности эти аспекты также могут быть applied to async methods, установив 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); 
    } 
} 

Если аспект не будет применяться к асинхронным методам, то вы можете показать окно и игнорировать исключение, как показано в следующем примере

Update. Начиная с PostSharp 5.0, следующий пример также работает с методами async.

[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; 
    } 
} 
+0

спасибо за ваш ответ. Я на самом деле новичок. Можно ли получить полный код с моим примером «OnErrorShowMessageBox» в вопросе, пожалуйста? Я не вижу, как использовать свой код в вопросе спасибо. – Julian50

+2

Во втором примере показан аспект, эквивалентный вашему первоначальному аспекту. К сожалению, изменение поведения потока не будет работать, если вы примените аспект к методам async. То, что вы можете сделать с помощью методов async, - это, по крайней мере, регистрировать исключение, как показано в первом примере. – AlexD