例如,我有一个日志记录工作流,我想在日志记录工作流中使用异步。如何bind
在异步工作流程中调用日志记录?
log {
async {
let! a = .... // Need to do logging here.
let! b = .... // Need to do async here
编辑:我听说在 F# 中使用工作流替换 AOP 以实现横切关注点是个好主意。我不确定如何处理嵌入问题。或者使用工作流不是一个好主意?
例如,我有一个日志记录工作流,我想在日志记录工作流中使用异步。如何bind
在异步工作流程中调用日志记录?
log {
async {
let! a = .... // Need to do logging here.
let! b = .... // Need to do async here
编辑:我听说在 F# 中使用工作流替换 AOP 以实现横切关注点是个好主意。我不确定如何处理嵌入问题。或者使用工作流不是一个好主意?
F# 没有任何自动执行此操作的方法。您本质上想要的是创建一个组合计算来捕获两种不同的行为。做到这一点的最好方法是定义一个新的计算,比如说asyncLog
,它可以让你做你需要的两件事。这并不容易,但以下是很好的起点:
asyncSeq
展示了如何创建异步序列实际上,您不需要在 F#中经常这样做,因为要编写的计算表达式并不多。
在您的示例中,您正在使用async
and log
。虽然在解释计算表达式如何工作时,日志记录是一个很好的演示,但我不确定我是否会在实践中使用计算表达式将日志记录添加到我的应用程序中——使用全局记录器对象并直接调用它似乎更容易(但是这真的取决于你的log
计算在幕后做了什么)。
您可以为此https://github.com/jack-pappas/ExtCore/blob/master/ExtCore/Control.fs#L1769使用 AsyncReader 计算表达式,并在需要时提升 Asyncs 和 Readers。