多线程迭代之——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 }
原文地址:https://www.cnblogs.com/eval/p/5710543.html