gpt4 book ai didi

c# - 从 C# 调用和等待 F# 异步方法

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:11 25 4
gpt4 key购买 nike

我在 F# 中有这个:

type RuleStore() =

...
static member LoadAsync : Async<RulesStore> =
async {
let! r = Startup.States.GetAsStringAsync("rules") |> Async.AwaitTask

return
if String.IsNullOrEmpty r then
new RulesStore()
else
JsonConvert.DeserializeObject<RulesStore>(r);
}

我正尝试从 C# 调用它,但语法似乎不起作用。

NewRules = await Rules.RulesStore.LoadAsync();

我得到的错误是:

Core.cs(29, 38): [CS1955] Non-invocable member 'Rules.RulesStore.LoadAsync' cannot be used like a method.

我不太明白,因为我的印象是 LoadAsync 只是一个静态方法。

最佳答案

不能调用await Rules.RulesStore.LoadAsync()的原因有两个.

首先,您的代码实际上定义了一个只读属性。在 F# 中,定义 get-only 属性的语法与定义方法的语法非常相似:

static member LoadAsync : Async<RulesStore> =   // Defines a get-only property
static member LoadAsync() : Async<RulesStore> = // Defines a method

您可以使用只读属性并调用 await Rules.RulesStore.LoadAsync ,但这对于 C# 调用者来说可能看起来很奇怪,因此方法似乎是更好的选择。

其次,您的代码返回 Async<'T>但 C# 适用于 Task<'T>改为键入。您可以在 C# 中将 Async 转换为 Task,但在 F# 端执行此操作更容易。为此,您需要更改类型并添加 Async.StartAsTask到最后(作为个人风格偏好,我也会在 return 中使用 if,但这只是因为我认为它看起来更好):

type RuleStore() =

...
static member LoadAsync : Task<RulesStore> =
async {
let! r = Startup.States.GetAsStringAsync("rules") |> Async.AwaitTask
if String.IsNullOrEmpty r then
return new RulesStore()
else
return JsonConvert.DeserializeObject<RulesStore>(r);
} |> Async.StartAsTask

关于c# - 从 C# 调用和等待 F# 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924405/

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