使用异步的 C# 代码的 F# 等效项是什么?
What would be an F# equivalent of the C# code using async?
我正在努力编写一个 F# 代码来顺序等待一些异步方法调用。我熟悉 F# 异步工作流,但无法弄清楚如何将其映射到一个简单的案例。
让我们以异步 XmlReader 为例。 C# 代码可能如下所示:
using (XmlReader r = XmlReader.Create(new StringReader(input), new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine(r.LocalName);
break;
case XmlNodeType.Text:
Console.WriteLine(await r.GetValueAsync());
break;
}
}
}
如果此代码不使用异步调用,我们可以使用递归和模式匹配在 F# 中重写它。但是它使用了 ReadAsync 和 GetValueAsync,它们在 F# 对应物中如何表达?
这完全未经测试,但我认为明白了要点。它的本质是你需要使用 Async.AwaitTask
将 Task
转换为 Async
然后剩下的就很明显了。
let doRecursiveAsyncThing input = async {
use r = XmlReader.Create(new StringReader(input), new XmlReaderSettings(Async = true ))
let loop x = async {
let! noteType = r.ReadAsync() |> Async.AwaitTask
match noteType with
| XmlNodeType.Element -> Console.WriteLine r.LocalName
do! loop x
| XmlNodeType.Text -> let! value = r.GetValueAsync() |> Async.AwaitTask
Console.WriteLine value
do! loop x
| _ -> () }
}
do! loop r
我正在努力编写一个 F# 代码来顺序等待一些异步方法调用。我熟悉 F# 异步工作流,但无法弄清楚如何将其映射到一个简单的案例。
让我们以异步 XmlReader 为例。 C# 代码可能如下所示:
using (XmlReader r = XmlReader.Create(new StringReader(input), new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine(r.LocalName);
break;
case XmlNodeType.Text:
Console.WriteLine(await r.GetValueAsync());
break;
}
}
}
如果此代码不使用异步调用,我们可以使用递归和模式匹配在 F# 中重写它。但是它使用了 ReadAsync 和 GetValueAsync,它们在 F# 对应物中如何表达?
这完全未经测试,但我认为明白了要点。它的本质是你需要使用 Async.AwaitTask
将 Task
转换为 Async
然后剩下的就很明显了。
let doRecursiveAsyncThing input = async {
use r = XmlReader.Create(new StringReader(input), new XmlReaderSettings(Async = true ))
let loop x = async {
let! noteType = r.ReadAsync() |> Async.AwaitTask
match noteType with
| XmlNodeType.Element -> Console.WriteLine r.LocalName
do! loop x
| XmlNodeType.Text -> let! value = r.GetValueAsync() |> Async.AwaitTask
Console.WriteLine value
do! loop x
| _ -> () }
}
do! loop r