Использование PostSharp
для обертывания вызова службы WCF с помощью АОП с использованием методов OnEntry
и OnExit
для OnMethodBoundaryAspect
.Подождите, пока метод Async закончит по отдельному методу
Процесс:
OnEntry()
это называют,DateTime
сигнализации о начале вызова хранится в свойстве и асинхронная задача, запускается перед тем, способ завершается в то время как целевая продолжается.Эта задача форматирует некоторую информацию о вызове службы для ведения журнала и может занять некоторое время. Эти значения сохраняются в качестве свойств этого класса для ведения журнала.
OnExit()
называется, ещеDateTime
сигнализация окончания вызова сохраняется. На этом этапе мне нужно убедиться, что Задача, запущенная в методеOnEntry()
, завершена, и все свойства готовы к регистрации в базе данных.
Вопрос заключается в том, как я могу убедиться, что задачи началась в OnEntry()
завершена для использования в OnExit()
? Я подумал о создании логического, while(false) {Thread.Sleep(100);}
, а затем закончить, когда это правда, но по какой-то причине это не кажется правильным.
Ниже приведен код, который я сейчас установил для этого.
class LogMethodCallAttribute : OnMethodBoundaryAspect
{
Int32 userId;
String methodCall;
String ip;
DateTime entryTime;
DateTime exitTime;
/// Performs tasks on a Method before its execution.
public override void OnEntry(MethodExecutionArgs args)
{
// Set OnEntry Time
entryTime = DateTime.Now;
if (ConfigurationManager.AppSettings["AOPLoggingEnabled"] == "1")
{
MessageProperties prop = OperationContext.Current.IncomingMessageProperties;
// Queue the logging to run on the ThreadPool so the service can finish the request.
Task.Factory.StartNew(() => SetUpLog(args, prop));
}
}
public override void OnExit(MethodExecutionArgs args)
{
// Set OnExit Time
exitTime = DateTime.Now;
// Need to make sure the Task running SetUpLog is complete and all props set.
// Log the details of this method call.
Logs.LogWebServiceCall(userId, methodName, ip, entryTime, exitTime);
}
// Format details for logging.
private void SetUpLog(MethodExecutionArgs args, MessageProperties prop)
{
// Retrieve all the required data and do any formatting.
userId = ...;
methodCall = ...;
ip = ...;
}
}
магазин задача вернулся из 'Task.Factory.StartNew' в vriable и' Wait' его в OnExit. –