gpt4 book ai didi

f# - 如何等待异步方法,类似于 C#

转载 作者:行者123 更新时间:2023-12-02 17:13:34 33 4
gpt4 key购买 nike

如何在 F# 中执行简单的 await

在 C# 中,我有这样的代码:

await collection.InsertOneAsync(DO);
var r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO)

所以我创建了一个让 await = ... 让我的 F# 代码变得与我的 C# 代码更相似。

我当前的 F# 代码是这样的:

let awaits (t: Threading.Tasks.Task) = t |> Async.AwaitTask |> Async.RunSynchronously
let await (t: Threading.Tasks.Task<'T>) = t |> Async.AwaitTask |> Async.RunSynchronously


let Busca (numero) =
let c = collection.Find(fun d -> d.Numero=numero).ToList()
c

let Insere(DO: DiarioOficial) =
//collection.InsertOneAsync(DO) |> Async.AwaitTask |> Async.RunSynchronously
collection.InsertOneAsync(DO) |> awaits

let Salva (DO: DiarioOficial) =
//let r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) |> Async.AwaitTask |> Async.RunSynchronously
let r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) |> await
r

我只想为 await(等待)定义一个,但我能做的最好的就是这样,因为在 Insere 上,类型是 Task,但在 Salva 上,类型是 Task<'T>

如果我只使用await,我会得到这个编译错误:

FS0001 The type 'Threading.Tasks.Task' is not compatible with the type 'Threading.Tasks.Task<'a>'

如果我只使用等待,它会编译,但我会丢失异步任务
的返回类型我想将 await 和 await 合并到一个

let await = ...

我该怎么做?

最佳答案

在 F# 中,我们倾向于使用另一种语法。它被描述为例如这里:https://fsharpforfunandprofit.com/posts/concurrency-async-and-parallel/.

或此处:https://learn.microsoft.com/en-us/dotnet/fsharp/tutorials/asynchronous-and-concurrent-programming/async

使用 C# 任务的想法是将它们“转换”为与 Async.Await<'T> 异步

您可能可以用另一种方式来做,但这是最直接的。

关于f# - 如何等待异步方法,类似于 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781011/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com