2017-04-10 2 views
1

저는 프로젝트에서 postsharp 무료 버전을 사용하는 회사에서 3 개월간 일하고 있습니다.postsharp가 state-machine 방법으로 작업하는지 보여줍니다.

그러나이 프로젝트에는 "ApplyToStateMachine"구성을 사용하지 않고 사용자 지정 측면을 사용하는 여러 가지 상태 - 시스템 방법 (async 및 다른 일부 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 가지 aspect 메소드 중 하나만 바꿔 버립니다 - OnEntry.

OnSuccess은 비동기 메서드의 첫 번째 부분이 완료 될 때 너무 빨리 실행됩니다. 그래서 첫 번째 부분은 첫 번째 기다리고 있습니다. 메소드가 예외를 던져 버렸기 때문에 더욱 그렇다.

OnExit 너무 일찍 (분명히) 불렀습니다.

OnException 메서드가 예외를 throw 했음에도 불구하고 전혀 호출되지 않았습니다.

로깅 또는 측정 실행 시간과 같은 단순한 경우조차도 파손되거나 (훨씬 나 빠지다) 생산할 수 있기 때문에 거의 모든 것이 손상되어 예상대로 작동하지 않습니다. 잘못된 결과.

OnEntry 
started 
second part 
OnException(exception) 
OnExit 
exception caught 
: 우리가 ApplyToStateMachine을 설정하면

그것은 올바른 출력을 생성