2010-07-09 4 views
0

Exemple:Instrumentation appels de méthode dans une application Web en utilisant PostSharp

ajouter un attribut PostSharp à une méthode pour assurer un chronomètre est déclenché avant que la méthode est appelée, et arrêté juste après le retour d'appel. Cette méthode est utilisée dans une application Web, elle sera donc appelée par plusieurs threads.

Je stocke le résultat du chronométrage du chronomètre dans une collection threadsafe statique, à utiliser par tous les threads. Cette collection peut ensuite être lue par un autre thread de surveillance à des fins d'analyse.

Est-ce que cela forcera effectivement tous les appels de méthode à se bloquer pendant qu'ils attendent que le verrou de la collection soit libéré? (afin qu'ils puissent compléter le bloc de code postsharp).

La messagerie asynchrone utilisant MSMQ permettrait-elle une solution non bloquante à ce problème?

PostSharp Code Attribut:

// ...

public static ThreadSafeCollection _collection; 

public override void OnInvocation(MethodInvocationEventArgs eventArgs) 
{ 
    var start = DateTime.Now; 
    eventArgs.Proceed(); 
    var timeSpent = (DateTime.Now - start).TotalMilliseconds; 

    _collection.Add(timeSpent); //will this cause all 
           //method calls to methods 
           //decorated with this 
           //attribute to block on the 
           //_collection addition? 
} 

// ...

Répondre

1

Est-ce que cette force efficacement tous les appels de méthode pour bloquer pendant qu'ils attendent le verrou sur la collection à être publié? (afin qu'ils puissent compléter le bloc de code postsharp).

Oui

Would messagerie asynchrone en utilisant MSMQ permettent une solution non-bloquant à ce problème?

Peut-être que. Les détails internes de la façon dont les poignées msmq envoient la requête ne sont pas documentés (pour autant que je sache).

Une autre option consisterait à utiliser une collection spécifique au thread (non synchronisée). Et déplacer son contenu vers une collection partagée (non synchronisée) uniquement lorsque le verrou sur la collection partagée est libre.

1

Vous devriez plutôt utiliser OnMethodBoundaryAspect car OnMethodInvocationAspect a une surcharge significative. Étant donné que l'effet de votre aspect est très léger, PostSharp 2.0 Professional Edition générerait un code beaucoup plus efficace.

Questions connexes