假设我想从 F# 调用这个 C# 函数:
public static class Foo {
public Bar Baz()
{
...
}
}
问题是这个功能是 CPU 密集型的,我不想阻止它。不幸的是,C# 库没有Task<Bar> BazAsync()
重载。
然后我想自己提供异步版本,方法是创建一个调用它并返回 (already started) 的 F# 函数Async<Bar>
。也就是说,我不想使用System.Threading.Task<Bar>
.
我想我正在寻找的是等同Task<T>.Run()
于 F# Async 的做事方式。
我已经看过以下选项:
Async.StartAsTask
-> 处理 C#ish 任务类型。Async.Start
和Async.StartImmediately
->Async<unit>
不接收Async<T>
是Async.StartChild
我要找的吗?如果是,那将是:
let BazWrapper() =
let asyncTask: Async<Bar> = async {
return Foo.Bar()
}
Async.StartChild asyncTask
但是,如果以上是解决方案:
- 为什么大多数关于 F# 异步工作流的文档都没有提到 StartChild?
- 为什么 BazWrapper 返回
Async<Async<Bar>>
而不是Async<Bar>
?