ちょうど彼にこのコードを表示し、彼を説得するのは難しいことではないようになります。
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つのアスペクトメソッドのうち、1つだけを正しくオーバーライドする - OnEntry
。
OnSuccess
は、非同期メソッドの最初の部分が終了したときに早すぎます(したがって、最初に待っています)。メソッドが例外をスローしたので、それは間違っています。
OnExit
も早く(明らかに)呼び出されました。
OnException
メソッドが例外をスローしたにもかかわらず、全く呼び出されていません。
ほとんどすべてが壊れていて、期待通りに動作しません。どのように使用できるかわからないため、ロギングや実行時間のような単純なものであっても、不正確な結果。
OnEntry
started
second part
OnException(exception)
OnExit
exception caught
:我々は
ApplyToStateMachine
を設定した場合
それは正しい出力を生成します
出典
2017-04-10 16:34:49
Evk