• 多线程迭代之——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 }
  • 相关阅读:
    C++ 数字、string 简便互转
    【C语言】递归函数DigitSum(n)
    UVALIVE 4287 Proving Equivalences (强连通分量+缩点)
    【linux驱动分析】misc设备驱动
    C++ auto 与 register、static keyword 浅析
    spring 计时器
    Spring注解配置定时任务<task:annotation-driven/>
    去除ckeditor上传图片预览中的英文字母
    编码规范
    git 手动操作
  • 原文地址:https://www.cnblogs.com/eval/p/5710543.html
Copyright © 2020-2023  润新知