Asynchronous 具有F#和Task<;T>;

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台

我有这样一个C#API:

Task<T> Foo(serverUri)
实施将有以下要求:

  • 使用3个不同的ServerURI对Foo()执行3个(最多)并发调用
  • 选择两个最快的成功响应。如果它们给出相同的结果T1和T2(即T1==T2),停止执行并发请求,忽略/取消正在进行的请求,并返回T的安全值。如果T1=T2,继续执行更多请求(或查看响应),直到找到两个相等的响应
  • 如果任何请求失败(抛出ServerException),请尝试使用以前未请求过的serverUri
  • 如果对所有4台服务器的所有请求都失败,则返回ConnectionError
  • 如果只有1个请求成功,则返回T的弱值

  • 考虑到我不能使用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 *)
    }