如何忽略 F# 中任务的结果?

问题描述 投票:0回答:4

如果我们有一个函数

f
返回
Async<something>
,我们可以用
do! f() |> Async.Ignore
忽略返回值。是否有类似的构造来忽略任务的返回值?现在,我必须做这样的事情:

task {
    let! result = SomeOperation()
    result |> ignore
}

从技术上讲,我可以做到

|> Async.AwaitTask |> Async.Ignore
,但我不确定将任务转换为异步只是为了忽略它的返回值是多么浪费......

如果重要的话,我正在使用 Ply 的

task{}
计算表达式。

f#
4个回答
1
投票

您可以使用

Result
属性等待任务完成:

let t = 
    task { 
        let! _ = SomeOperation()
        ()
    }
let _ = t.Result

0
投票

如果您的函数返回异步,那么简单地忽略它是行不通的,因为与

Task
不同,
Async
操作不会执行,除非您明确启动它。

如果您只想让它运行,但不关心等待它完成,您可以这样做

f() |> Async.RunAsTask |> ignore

如果你确实想等待结果,你可以这样做

f() |> Async.RunSynchronously |> ignore

0
投票

我的解决方案是定义类似于 Async.Ignore 的 Task.Ignore 函数:

type Task
with static member Ignore(f) = task { let! _ = f in return () }

这样你的代码看起来像:

task {
    do! SomeOperation() |> Task.Ignore
}

-1
投票

如果你不关心返回值,那么你不必等待任务完成,你可以忽略整个任务:

SomeOperation() |> ignore
© www.soinside.com 2019 - 2024. All rights reserved.