如何异步执行方法?
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
以下 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