Инструментарий вызовов методов в веб-приложении с использованием PostSharp

Пример:

Я добавляю в метод атрибут PostSharp, чтобы секундомер запускался до вызова метода и останавливался сразу после возврата из вызова. Этот метод используется в веб-приложении, поэтому он будет вызываться несколькими потоками.

Я сохраняю результат секундомера в статической потокобезопасной коллекции для использования всеми потоками. Затем этот набор может быть прочитан другим потоком мониторинга для целей анализа.

Будет ли это эффективно заставлять все вызовы методов блокироваться, пока они ждут снятия блокировки коллекции? (чтобы они могли завершить блок кода postsharp).

Может ли асинхронный обмен сообщениями с использованием MSMQ обеспечить неблокирующее решение этой проблемы?

Код атрибута PostSharp:

//...

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?
}

//...


person Ben Aston    schedule 09.07.2010    source источник


Ответы (2)


Будет ли это эффективно заставлять все вызовы методов блокироваться, пока они ждут снятия блокировки коллекции? (чтобы они могли завершить блок кода postsharp).

Да

Может ли асинхронный обмен сообщениями с использованием MSMQ обеспечить неблокирующее решение этой проблемы?

Может быть. Внутренние детали того, как msmq обрабатывает запрос на отправку, не задокументированы (насколько мне известно).

Другой вариант - использовать коллекцию, специфичную для потока (не синхронизированную). И перемещать его содержимое в общую коллекцию (не синхронизированную) только тогда, когда блокировка общей коллекции свободна.

person Igal Serban    schedule 09.07.2010

Лучше использовать OnMethodBoundaryAspect, поскольку OnMethodInvocationAspect имеет значительные накладные расходы. Учитывая, что эффект вашего аспекта очень легкий, PostSharp 2.0 Professional Edition будет генерировать гораздо более эффективный код.

person Gael Fraiteur    schedule 11.07.2010