【发布时间】:2013-11-18 18:30:49
【问题描述】:
如果我遗漏了什么,并且在阅读 PostSharp 文档时这个问题没有意义,或者答案对我来说并不明显,我深表歉意。
我创建了一个简单的日志记录方面,它使用自定义日志记录服务将有关 WCF 方法调用的详细信息放入数据库中。一旦调用了日志记录方面,它需要自行继续,而不是阻止 WCF 方法本身的执行。我很好奇 OnEntry() 方法是否可以异步?自定义日志服务使用异步调用将日志放入数据库,但希望两者之间有更多的分离。
看点:
[Serializable]
class LoggingAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
// Perform the logging
}
}
WCF 方法:
[LoggingAspect]
public String DoSomething(int param1, int param2)
{
// Do stuff?
}
编辑:解决方案
感谢下面的信息,我能够想出一个适合我的解决方案。我可以通过将一些时间戳写入 DoSomething() 和 OnEntry() 的文件来测试这一点。我添加了一个 Thread.Sleep(30000),然后将另一个时间戳写入 PerformLog()。我的 DoSomething() 方法能够在 PerformLog() 完成写入日志服务之前完成 :)
看点:
[Serializable]
class LoggingAspect : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
// Write timestamp to file.
Task.Run( () => PerformLog(args) );
}
private void PerformLog(MethodExecutiionArgs args)
{
// Thread.Sleep(30000);
// Write timestamp to file.
// Perform the logging
}
}
WCF 方法:
[LoggingAspect]
public String DoSomething(int param1, int param2)
{
// Write timestamp to file.
// Do stuff?
}
【问题讨论】:
-
我看到的唯一真正的选择是:将你想做的任何事情异步放入全局/静态 ConcurrentQueue 并实现一个线程来消耗/处理来自该队列的工作 - 基本上用 Producer 处理这个/消费者模式。
标签: c# wcf asynchronous postsharp