正确的使用方法!等待任务的关键字<'a>

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

我正在使用 F# 与异步 C# 类进行互操作。

我有一个情况,我需要调用一个返回泛型

Task<'a>
的方法,等待它完成,然后忽略结果。

通过使用 F# 文档,我了解到您可以使用

do!
来等待非泛型
Task

task {
    do! obj.workAsync() // where workAsync: () -> Task
}

太好了。但是当

workAsync
的签名是
() -> Task<'a>
时,上面的方法就不起作用了。

所以我需要一些方法来转动

Task<'a> -> Task
,我想出了两种方法(可能还有更多我不知道的方法)。

// variant 1
let toNonGenericTask (res: Task<'a>) : Task =
    task {
        let! _ = res
        ()
    }

// variant 2
let toNonGenericTask (res: Task<'a>) : Task =
    res.ContinueWith(fun (_: Task<'a>) -> ())


let processStuff () =
    task {
        do! obj.workAsync() |> toNonGenericTask // both variants work!
    }

我的问题是,哪个版本的

toNonGenericTask
功能是首选?有没有其他方法可以在不使用客户帮助功能的情况下完成同样的事情?

f# task
1个回答
0
投票

您可以简单地使用

workAsync()
来调用
let! _ = ...
,就像在第一个示例中所做的那样:

let processStuff () =
    task {
        let! _ = obj.workAsync() // this works too!
    }
© www.soinside.com 2019 - 2024. All rights reserved.