如何异步执行方法?

时间:2017-12-13 00:00:58

标签: f# task-parallel-library

以下 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

如果我正确地这样做,我会毫无头绪 推荐的技术是什么?

2 个答案:

答案 0 :(得分:2)

根据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)

答案 1 :(得分:0)

斯科特,只是想提供另一种选择。如果你可以在首次访问时实例化你的标签列表(而不是模块初始化,你似乎在避免),你可能会尝试一种懒惰的计算。

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