假设我想从 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>?