Пример:
Я добавляю в метод атрибут 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?
}
//...