【问题标题】:How to make PostSharp's OnMethodBoundaryAspect OnEntry method Asynchronous如何使 PostSharp 的 OnMethodBoundaryAspect OnEntry 方法异步
【发布时间】: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


【解决方案1】:

您为什么不为您的日志记录逻辑启动一个任务并让 OnEntry 方法返回?

【讨论】:

  • 你是指在我提到的单独的日志服务中添加一个任务吗?我们确实将单独的日志服务设置为异步运行,因此当调用该部分时,我们可以忘记它并继续前进。这个 OnEntry 中的问题是,我还有很多工作要做,以便让数据准备好发送到我们的日志服务,而我不需要等待。根据我对 Tasks 和 async 修饰符的理解,它们需要等待才能接收响应,您不能完全触发并忘记。
  • OnEntry 总是从你自己的方法同步调用,所以这个答案给出了最合理的解决方案。将您的 OnEntry 逻辑移动到另一个方法并为其启动一个异步任务 (Task.Run(...)),然后从 OnEntry 返回。如果要确保任务在从 WCF 方法返回之前已经结束,则可以在 OnExit 方法中等待任务(将其存储在 MethodExecutionArgs.MethodExecutionTag 中)。
  • 我没有发现您能够简单地执行 Task.Run() 而无需等待返回。我相信你们两个已经让我找到了解决方案:) 将此标记为正确并用我最终得到的结果编辑我的问题。
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多