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 }
  • 相关阅读:
    java程序员面试笔记宝典 note
    JVM常见面试题
    面试&笔试总结 数据库、网络协议、常识
    面试&笔试总结 Java框架篇
    面试准备&总结-Java基础篇
    JDBC事务管理及SavePoint示例
    JSP的内置对象
    Java中的集合框架
    .NET WEBAPI 添加中英文切换,国际化项目
    搜索引擎入门 (建立一个简单的java Lucene实例)
  • 原文地址:https://www.cnblogs.com/eval/p/5710543.html
Copyright © 2011-2022 走看看