多线程迭代之——LINQ to TaskQuery
平时经常会迭代集合,如果数据多的话会很耗时。
例子:
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();
}
}
多线程迭代之——LINQ to TaskQuery的更多相关文章
- 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T ...
- .Net多线程编程—Parallel LINQ、线程池
Parallel LINQ 1 System.Linq.ParallelEnumerable 重要方法概览: 1)public static ParallelQuery<TSource> ...
- 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V2
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——增加WriteQueue队列,存放selectionKey.addWriteEventToQueue()添加selectionKey并唤醒阻 ...
- 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源). ( ...
- 转载 .Net多线程编程—并发集合 https://www.cnblogs.com/hdwgxz/p/6258014.html
集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全的, ...
- CopyOnWriteArrayList真的完全线程安全吗
我之前书上看到的说法是:Vector是相对线程安全,CopyOnWriteArrayList是绝对线程安全 这种说法其实有些问题,CopyOnWriteArrayList在某些场景下还是会报错的 Co ...
- 网络编程 -- RPC实现原理 -- 目录
-- 啦啦啦 -- 网络编程 -- RPC实现原理 -- NIO单线程 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1 网络编程 -- RPC实现原理 -- NIO多线程 -- ...
- C#强大的编程功能
下面列出一些C#重要的功能 1.布尔条件 2.自动垃圾回收 3.标准库 4.组件版本 5.属性和事件 6.委托和事件管理 7.易于使用的泛型 8.索引器 9.条件编译 10.简单的多线程 11.LIN ...
- 一点一点看JDK源码(二)java.util.List
一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...
随机推荐
- BZOJ3252: 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景 ...
- MongoDB-权限配置
启动 Mongo\bin\mongo.exe1.添加>use admin #切换到MongoDB数据库的用户表>db.addUser("Name","Pass ...
- jquery 练习笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [LintCode] Add Two Numbers 两个数字相加
You have two numbers represented by a linked list, where each node contains a single digit. The digi ...
- easyUI下拉列表三级联动
首先是先想好数据库的搭建,通过地区id,地区名称,上级地区id就可以实现,所有省市区的数据 例如: DAO层 service层 Servlet 页面 <!DOCTYPE html> < ...
- MySQL sql_safe_updates 分析
我在练习MySQL操作语句时,使用一条完全没有错误的语句: update students set name='drake' where name='chuan'; 却报了如下错误: Error Co ...
- 使用File查询出所有的文件和目录的信息
public class Test34 { public static void main(String[] args) { File f=new File("f:"); File ...
- php遍历目录
function zx($dir){ if(is_dir($dir)){ $filesnames = scandir($dir); foreach ($filesnames as $name) { i ...
- 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...
- 读取java目录中相同目录、相同名称的文件
使用ClassLoader的getResources方法(注意,不是getResource,少了s),可获得指定文件的包含jar包名称的多个路径值,然后依次读取文件即可. 使用class,只能通过ge ...