2017-04-10 3 views
1

私はプロジェクトでpostsharpフリーエディションを使用している会社で3ヶ月働いています。postsharpがステートマシンメソッドで動作しているかどうかを示します

しかし、このプロジェクトには、「ApplyToStateMachine」設定のカスタム・アスペクトを使用するいくつかのステート・マシン・メソッド(非同期および一部のlinq問合せを持つメソッド)があり、開発者は警告を無視していました。

無料版では、プロジェクトごとに10クラスで「ApplyToStateMachine」しか使用できませんが、プロジェクトにはさらに多くのものがあります。

私はボスにポストシャープライセンスを購入させるために、これがもたらす問題を実証する必要があります。いくつかのデモンストレーションプロジェクトや、ステートマシンメソッドでの側面の問題を説明するための指示がいくつかありますか?

ありがとうございます!

答えて

1

ちょうど彼にこのコードを表示し、彼を説得するのは難しいことではないようになります。

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を設定した場合

それは正しい出力を生成します

関連する問題