F#中有Scala's Promise之类的内容吗?
虽然期货被定义为一种只读占位符对象 为了一个尚未存在的结果而创造,可以想到一个承诺 作为一个可写的单一赋值容器,它完成了一个 未来。也就是说,承诺可以用来成功完成一个 未来的价值(通过“完成”承诺)使用成功 方法。相反,承诺也可用于完成未来 有一个例外,通过失败,使用失败方法。
Async的内容涵盖了部分内容,但如果您的代码在异步环境之外运行,则Promises是一个方便的工具。 (例如,你可以做一些事情,比如在UI线程中完成一个Promise - 即使UI环境对Async一无所知。)
答案 0 :(得分:13)
承诺的.Net等价物是TaskCompletionSource,因此您可以从F#中使用它们。您可以使用Async.AwaitTask例如
从Async<T>
创建Task<T>
let tcs = new TaskCompletionSource<int>()
let ta: Async<int> = Async.AwaitTask tcs.Task
//complete completion source using `SetResult`\`SetException` etc.