Scatter聚集异步等待

时间:2017-01-05 09:55:15

标签: c# async-await

我有一种情况,我对每个支持该方法的服务的第一个成功响应感兴趣

Task<Try<SearchResponse>> PerformSearch(SearchRequest request);

Try类是Good / Bad结果的容器(如错误​​Monad)

目前对服务列表的调用是

var searchResponses = await Task.WhenAll(
        _searchServices.Select(s => s.PerformSearch(request))); 
return searchResponses.FirstOrBad(sr=>sr.IsGood);

其中FirstOrBad是一个查找第一个好结果的扩展方法,或者返回一个包含所有错误的复合Bad Try。

据我所知,这个问题是由于WhenAll找到第一个好结果的时间受到最慢响应的限制。

我想在收到第一个阳性结果时继续执行,但如果不成功则不是第一个(第二个......等)结果,但如果所有结果都没有成功返回,我还要继续执行,报告缺乏成功。

我原以为这是一个常见的问题,但在搜索示例时却发现很少。除了分散聚集之外,它可能被其他一些术语所知。

1 个答案:

答案 0 :(得分:2)

这样的事情对你有用

select avg(age)
from (select t.*,
             row_number() over (order by age) as seqnum,
             count(*) over () as cnt
      from t
     ) t
where seqnum * 2 in (cnt, cnt + 1, cnt + 2);

此答案适配器TPL wait for task to complete with a specific return value