平时经常会迭代集合,如果数据多的话会很耗时。

例子:

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的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T ...

  2. .Net多线程编程—Parallel LINQ、线程池

    Parallel LINQ 1 System.Linq.ParallelEnumerable 重要方法概览: 1)public static ParallelQuery<TSource> ...

  3. 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V2

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——增加WriteQueue队列,存放selectionKey.addWriteEventToQueue()添加selectionKey并唤醒阻 ...

  4. 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源). ( ...

  5. 转载 .Net多线程编程—并发集合 https://www.cnblogs.com/hdwgxz/p/6258014.html

    集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全的, ...

  6. CopyOnWriteArrayList真的完全线程安全吗

    我之前书上看到的说法是:Vector是相对线程安全,CopyOnWriteArrayList是绝对线程安全 这种说法其实有些问题,CopyOnWriteArrayList在某些场景下还是会报错的 Co ...

  7. 网络编程 -- RPC实现原理 -- 目录

    -- 啦啦啦 -- 网络编程 -- RPC实现原理 -- NIO单线程 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1 网络编程 -- RPC实现原理 -- NIO多线程 -- ...

  8. C#强大的编程功能

    下面列出一些C#重要的功能 1.布尔条件 2.自动垃圾回收 3.标准库 4.组件版本 5.属性和事件 6.委托和事件管理 7.易于使用的泛型 8.索引器 9.条件编译 10.简单的多线程 11.LIN ...

  9. 一点一点看JDK源码(二)java.util.List

    一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...

随机推荐

  1. Python In Action:三、再来一个扩展例子,保证不难

    在窗口显示一张图片,代码如下: import wx class Frame(wx.Frame): """Frame class that displays an imag ...

  2. 使用TouchScript做2D按钮实现长按功能

    导入TouchScript 下载地址:https://www.assetstore.unity3d.com/#/content/7394 把TouchScript和Touch Debugger两个预设 ...

  3. MySQL主主复制+MMM实现高可用

    架构图: 环境规划 角色 IP VIP 用途 DB1 192.168.56.101 192.168.56.111/113 主Master提供wirte+read DB2 192.168.56.102 ...

  4. alternatives命令用法

    alternatives是Linux下的一个功能强大的命令.只能在根权限下执行.如系统中有几个命令功能十分类似,却又不能随意删除,那么可以用替代指定一个全局的设置.alternatives常用于同一个 ...

  5. SQL常用字段类型

    中文常用字段类型 1.   名称类    nvarchar(10) 2.   数量       int 3.   时间      date 4.   货币      money 5.   编号     ...

  6. SSH配置中出现问题

    问题1:org.springframework.beans.factory.NoSuchBeanDefinitionException: org.springframework.beans.facto ...

  7. remi

    很简单呀,又不用自己编译.用 http://rpms.remirepo.net/ 这个 remi 的包,直接 yum install php-swoole 就完事了 安装remi包也很简单, yum  ...

  8. django--models操作

    1.models的功能 操作数据库 提交验证 在django的admin中,使用的是modelForms所以在验证的时候,尽管在models后有error_ message参数也不会根据此来提示.具体 ...

  9. openfire 用户密码加密解密

    1.openfire采用的加密方法 Blowfish.java /** * $RCSfile$ * $Revision: 3657 $ * $Date: 2002-09-09 08:31:31 -07 ...

  10. sprintf数据库查询的作用

    $sql = sprintf("UPDATE file SET mimetype=null,title=null,size=null,protected=null WHERE id=%d&q ...