
平时经常会迭代集合,如果数据多的话会很耗时。
例子:
var list = new List<int> {, , };
list.ForEach(a => DoSomething(a)); void DoSomething(int a)
{
//耗时操作
}
优化方法一,使用并行操作,但它并行能力依赖于CPU核数:
var list = new List<int> {, , };
list.AsParallel().ForAll(a => DoSomething(a)); void DoSomething(int a)
{
//耗时操作
}
优化方法二,多线程(多任务)操作,基于Task实现,轻轻松松用上多线程:
var list = new List<int> {, , };
list.AsTaskQuery().ForAll(a => DoSomething(a)); void DoSomething(int a)
{
//耗时操作
}
AsTaskQuery具体实现:
接口声明
public interface ITaskQuery<out T> : IEnumerable<T>
{
}
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>定义
internal class TaskQuery<T> : ITaskQuery<T>
{
private readonly IEnumerable<T> _innerSource; public TaskQuery(IEnumerable<T> source)
{
this._innerSource = source;
} public IEnumerator<T> GetEnumerator()
{
return _innerSource.GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}