應該不是很難說服他,只是給他這樣的代碼:
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方面的方法,我們只覆蓋一個作品 - OnEntry
。
OnSuccess
執行得太早,當我們的異步方法的第一部分結束時(所以,就在第一次等待之前)。更多 - 這是錯誤的,因爲方法引發了一個異常。
OnExit
太早調用(顯然)。
OnException
根本沒有被調用,儘管方法拋出了異常。因爲任何合理的方面,甚至簡單的日誌記錄或測量執行時間都會被打破,或者(更糟糕的是)會產生更多的結果,因此,幾乎所有的事情都會被打破,並且不能按預期工作,不知道它如何可用。結果不正確。
如果我們設置ApplyToStateMachine
它會產生正確的輸出:
OnEntry
started
second part
OnException(exception)
OnExit
exception caught
來源
2017-04-10 16:34:49
Evk