Async.Task 返回 如果String.IsNullOrEmpty r,则 新规则存储库() 其他的 反序列化对象(r); },f#,F#" /> Async.Task 返回 如果String.IsNullOrEmpty r,则 新规则存储库() 其他的 反序列化对象(r); },f#,F#" />

让vs成员在F#中,需要澄清一些事情 让我们考虑下面的代码: type RulesStore() = ... static member LoadAsync : Async<RulesStore> = async { let! r = Startup.States.GetAsStringAsync("rules") |> Async.AwaitTask return if String.IsNullOrEmpty r then new RulesStore() else JsonConvert.DeserializeObject<RulesStore>(r); } 类型规则存储()= ... 静态成员LoadAsync:Async= 异步的{ let!r=Startup.States.GetAsStringAsync(“规则”)|>Async.Task 返回 如果String.IsNullOrEmpty r,则 新规则存储库() 其他的 反序列化对象(r); }

让vs成员在F#中,需要澄清一些事情 让我们考虑下面的代码: type RulesStore() = ... static member LoadAsync : Async<RulesStore> = async { let! r = Startup.States.GetAsStringAsync("rules") |> Async.AwaitTask return if String.IsNullOrEmpty r then new RulesStore() else JsonConvert.DeserializeObject<RulesStore>(r); } 类型规则存储()= ... 静态成员LoadAsync:Async= 异步的{ let!r=Startup.States.GetAsStringAsync(“规则”)|>Async.Task 返回 如果String.IsNullOrEmpty r,则 新规则存储库() 其他的 反序列化对象(r); },f#,F#,这是对象内部的静态方法,用于从存储的json或新的干净json获取该对象的实例 我是否有权相信,如果我替换: 静态成员LoadAsync:Async= 与 让LoadAsync:Async= LoadAsync将被计算一次,随后的加载将返回相同的结果?如果我错了,为什么会这样 这有点微妙。首先,将let(实例)与静态成员(静态)进行比较,这增加了每个实例发生的事情与所有实例共享的事情之间的明显区别 更有用的比较是比较常规成员和let。微妙的是,async计算本身是延迟的,所以它们只在执行时运行

这是对象内部的静态方法,用于从存储的json或新的干净json获取该对象的实例

我是否有权相信,如果我替换:

静态成员LoadAsync:Async=

让LoadAsync:Async=


LoadAsync将被计算一次,随后的加载将返回相同的结果?如果我错了,为什么会这样

这有点微妙。首先,将
let
(实例)与
静态成员
(静态)进行比较,这增加了每个实例发生的事情与所有实例共享的事情之间的明显区别

更有用的比较是比较常规
成员
let
。微妙的是,
async
计算本身是延迟的,所以它们只在执行时运行

下面是一个示例来说明这一点-我在
async
定义之前添加了一个
printf
,在
async
块中添加了一个,用于
let
成员

type A() = 
  let test = 
    printfn "let: before async"
    async { 
      printfn "let: inside async"
    }
  member x.Test =
    printfn "member: before async"
    async { 
      printfn "member: inside async"
    }
  member x.RunLet() = test |> Async.RunSynchronously
  member x.RunMember() = x.Test |> Async.RunSynchronously
以下是代码的作用:

let a = A() 
// prints "let: before async"
a.RunLet()  
// prints "let: inside async"
a.RunLet()  
// prints "let: inside async"
a.RunMember()  
// prints "member: before async"
// and "member: inside async"
a.RunMember()  
// prints "member: before async"
// and "member: inside async"
正如您所看到的,每次调用异步计算时,“内部异步”代码都会重复运行。但是,代码“在异步之前”只对
let
运行一次,对
成员运行多次


实际上,在异步之前几乎没有代码,所以这在典型的使用中没有太大的区别,但有一些区别-使用
let
,异步计算只构造一次,然后每次重复使用。

好的,这证实了我的想法。谢谢你举了一个例子来说明这一点!