그것은 그를 설득하는 것은 어렵지 않아, 단지 그에게이 코드를 표시해야합니다 :
class Program
{
static void Main(string[] args)
{
Wrapper();
Console.ReadKey();
}
static async void Wrapper() {
try {
await Test();
}
catch {
Console.WriteLine("exception caught");
}
}
[MyAspect]
static async Task Test() {
Console.WriteLine("started");
await Task.Delay(100);
Console.WriteLine("second part");
throw new Exception("exception");
}
}
[PSerializable]
class MyAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine("OnEntry");
}
public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine("OnSuccess({0})", args.ReturnValue);
}
public override void OnExit(MethodExecutionArgs args)
{
Console.WriteLine("OnExit");
}
public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine("OnException({0})", args.Exception.Message);
}
}
그것은 다음과 같은 출력 :
OnEntry
started
OnSuccess(System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult])
OnExit
second part
exception caught
우리가 볼 수있는 무엇을? 우리는 4 가지 aspect 메소드 중 하나만 바꿔 버립니다 - OnEntry
.
OnSuccess
은 비동기 메서드의 첫 번째 부분이 완료 될 때 너무 빨리 실행됩니다. 그래서 첫 번째 부분은 첫 번째 기다리고 있습니다. 메소드가 예외를 던져 버렸기 때문에 더욱 그렇다.
OnExit
너무 일찍 (분명히) 불렀습니다.
OnException
메서드가 예외를 throw 했음에도 불구하고 전혀 호출되지 않았습니다.
로깅 또는 측정 실행 시간과 같은 단순한 경우조차도 파손되거나 (훨씬 나 빠지다) 생산할 수 있기 때문에 거의 모든 것이 손상되어 예상대로 작동하지 않습니다. 잘못된 결과.
OnEntry
started
second part
OnException(exception)
OnExit
exception caught
: 우리가
ApplyToStateMachine
을 설정하면
그것은 올바른 출력을 생성
출처
2017-04-10 16:34:49
Evk