zoukankan      html  css  js  c++  java
  • 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);
    }
    }
    }
    }
  • 相关阅读:
    四则运算实现
    第四周例行报告
    代码规范,结对要求
    第三周例行报告
    第三周作业3功能测试
    第二周例行报告
    第一次作业汇总
    2017/2/24:Maven的pom jar war的区别
    oracle的常用99条语句
    2017/2/21:配置自己的中文乱码拦截器
  • 原文地址:https://www.cnblogs.com/zeroone/p/3737417.html
Copyright © 2011-2022 走看看