如何异步执行方法?

How do I execute a method asynchronously?

以下 Instance 方法需要大量时间来执行。

module CachedTags =

    let private x = [1..25] |> List.collect getTags
    let Instance() = x

因此,我想在初始化服务器会话时使此调用异步。

因此我认为我可以采取以下措施:

CachedTags.Instance() |> ignore

然后这样写:

Tasks.Task.Run(fun _ -> CachedTags.Instance() |> ignore) |> ignore

如果我这样做正确,我会一无所知。
实现此目的的推荐技术是什么?

根据this tutorial,你可以试试这个:

module CachedTags =

    // analog of task in C#
    let private x = async {
        [1..25] |> List.collect getTags
    } |> Async.StartAsTask

而当你需要结果的时候,你可以使用different options:

// synchronously wait in current thread
x.Wait()
// use system class in current thread
x |> Async.RunSynchronously 
// await result
let! result = Async.AwaitTask(x)

Scott,只是想提供一个替代方案。如果您可以在第一次访问时实例化标签列表(而不是在模块初始化时,您似乎在避免这种情况),您可以尝试惰性计算。

module CachedTags =

    let private x = lazy ([1..25] |> List.collect getTags)
    let Instance() = x.Value

let tags = CachedTags.Instance()

lazy 的使用相当地道,仅在第一次调用 Instance() 时实例化您的表达式(即 x.Value 的第一次求值)。

https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/lazy-computations