多线程迭代之——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 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步