我有一种情况,我对每个支持该方法的服务的第一个成功响应感兴趣
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
找到第一个好结果的时间受到最慢响应的限制。
我想在收到第一个阳性结果时继续执行,但如果不成功则不是第一个(第二个......等)结果,但如果所有结果都没有成功返回,我还要继续执行,报告缺乏成功。
我原以为这是一个常见的问题,但在搜索示例时却发现很少。除了分散聚集之外,它可能被其他一些术语所知。
答案 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