Asynchronous 具有F#和Task<;T>;
我有这样一个C#API:Asynchronous 具有F#和Task<;T>;,asynchronous,concurrency,f#,Asynchronous,Concurrency,F#,我有这样一个C#API: Task<T> Foo(serverUri) 实施将有以下要求: 使用3个不同的ServerURI对Foo()执行3个(最多)并发调用 选择两个最快的成功响应。如果它们给出相同的结果T1和T2(即T1==T2),停止执行并发请求,忽略/取消正在进行的请求,并返回T的安全值。如果T1=T2,继续执行更多请求(或查看响应),直到找到两个相等的响应 如果任何请求失败(抛出ServerException),请尝试使用以前未请求过的serverUri 如果对所有4台
Task<T> Foo(serverUri)
实施将有以下要求:
考虑到我不能使用F#的异步,而必须坚持使用C#的任务,这样做容易吗?在这一点上我有点不知所措。除非您有理由不能在代码中的任何地方使用
Async
,并且您唯一的限制是Foo
必须返回任务
,否则您应该可以将调用Foo
得到的任务
转换为Async
通过这种方式,您可以使用F#的异步计算表达式构建逻辑,就像Foo
返回了async
let simpleComputation serverUri = async {
let! fooResult = Foo(serverUri) |> Async.AwaitTask
(* here you can work with the T returned by Foo's task *)
}
我对库也有很好的经验,它允许您在异步计算表达式中直接使用
Task
,而无需显式调用AwaitTask
,并且通常有助于异步/任务互操作。尽管有些人可能不喜欢,但它会试图隐藏任务。您不能使用async
的任何原因?有些人不喜欢async
在调用异步API(如HttpClient、ADO.NET、EF、AWS SDK、,Azure SDK-中的所有非F#异步APIshort@PanagiotisKanavos这正是我提到图书馆的原因:)
let simpleComputation serverUri = async {
let! fooResult = Foo(serverUri) |> Async.AwaitTask
(* here you can work with the T returned by Foo's task *)
}