zoukankan      html  css  js  c++  java
  • 多线程迭代之——LINQ to TaskQuery

    平时经常会迭代集合,如果数据多的话会很耗时。

    例子:

    var list = new List<int> {3, 5, 10};
    list.ForEach(a => DoSomething(a));
    
    void DoSomething(int a)
    {
        //耗时操作
    }

    优化方法一,使用并行操作,但它并行能力依赖于CPU核数:

    var list = new List<int> {3, 5, 10};
    list.AsParallel().ForAll(a => DoSomething(a));
    
    void DoSomething(int a)
    {
        //耗时操作
    }

    优化方法二,多线程(多任务)操作,基于Task实现,轻轻松松用上多线程:

    var list = new List<int> {3, 5, 10};
    list.AsTaskQuery().ForAll(a => DoSomething(a));
    
    void DoSomething(int a)
    {
        //耗时操作
    }

    AsTaskQuery具体实现:

    接口声明

    1 public interface ITaskQuery<out T> : IEnumerable<T>
    2 {
    3 }

    ITaskQuery<T>的扩展方法定义

    public static class TaskQueryExtentisions
    {
            public static ITaskQuery<T> ForAll<T>(this ITaskQuery<T> source, Action<T> action)
            {
                var tasks = source.AsEnumerable().Select(item => Task.Factory.StartNew(() =>
                {
                    action(item);
                })).ToArray();
                Task.WaitAll(tasks);
                return source;
            }
        
        //其它扩展方法定义,比如 Select、Where 等
    }

    IEnumerable<T>扩展方法定义

    public static ITaskQuery<T> AsTaskQuery<T>(this IEnumerable<T> source)
    {
        return new TaskQuery<T>(source);
    }

    TaskQuery<T>定义

     1 internal class TaskQuery<T> : ITaskQuery<T>
     2 {
     3     private readonly IEnumerable<T> _innerSource;
     4 
     5     public TaskQuery(IEnumerable<T> source)
     6     {
     7         this._innerSource = source;
     8     }
     9 
    10     public IEnumerator<T> GetEnumerator()
    11     {
    12         return _innerSource.GetEnumerator();
    13     }
    14 
    15     IEnumerator IEnumerable.GetEnumerator()
    16     {
    17         return GetEnumerator();
    18     }
    19 }
  • 相关阅读:
    1scala基础
    3scala高级
    03spark kafka
    01spark基础
    04spark streaming
    2scala集合
    02spark sql
    学习java程序设计环境的心得
    第五章继承
    第二周学习Java心得
  • 原文地址:https://www.cnblogs.com/eval/p/5710543.html
Copyright © 2011-2022 走看看