AsyncEnumerableExtensions.cs z

public static class Extensions
{
public static async Task ForEachAsync < T , U >( this IEnumerable < T > collection , Func < T , Task < U >> body , IObserver < U > observer = null )
{
foreach ( var item in collection )
{
var res = await body ( item );
if ( null != observer )
{
observer . OnNext ( res );
}
}
}
 
public static async Task ForEachAsyncPerformance < T , U >( this IEnumerable < T > collection , Func < T , Task < U >> body , IObserver < U > observer = null )
{
var enumerator = collection . GetEnumerator ();
 
Task < U > task = null ;
if ( enumerator . MoveNext ())
{
task = body ( enumerator . Current );
}
while ( enumerator . MoveNext ())
{
var item = enumerator . Current ;
var res = await task ;
task = body ( item );
if ( null != observer )
{
observer . OnNext ( res );
}
}
if ( null != task )
{
var res = await task ;
if ( null != observer )
{
observer . OnNext ( res );
}
}
}
 
public static async Task ForEachAsync < T , U >( this IEnumerable < T > collection , int parallelism , Func < T , Task < U >> body , IObserver < U > observer = null )
{
int inFlight = 0 ;
var tasks = new HashSet < Task < U >>();
 
foreach ( var item in collection )
{
if ( inFlight >= parallelism )
{
var task = await Task . WhenAny ( tasks );
tasks . Remove ( task );
inFlight --;
if ( null != observer )
{
observer . OnNext ( task . Result );
}
}
 
inFlight ++;
tasks . Add ( body ( item ));
}
 
while ( inFlight > 0 )
{
var task = await Task . WhenAny ( tasks );
tasks . Remove ( task );
inFlight --;
if ( null != observer )
{
observer . OnNext ( task . Result );
}
}
}
}

转载于:https://www.cnblogs.com/zeroone/p/3737417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值