一.介绍

Task是.NetFramework3.0出现的,线程是基于线程池,然后提供了丰富的API. 先用AverageAssign方法把一组数据平均分成n组,再通过遍历n组数据,循环开Task多线程。

二.平均分组方法

        /// <summary>
/// 将一组数据平均分成n组
/// </summary>
/// <param name="source">要分组的数据源</param>
/// <param name="n">平均分成n组</param>
/// <returns><T></returns>
public static List<List<T>> AverageAssign(List<T> source, int n)
{
List<List<T>> result = new List<List<T>>();
int remainder = source.Count() % n; //(先计算出余数)
int number = source.Count() / n; //然后是商
int offset = ;//偏移量
for (int i = ; i < n; i++)
{
List<T> value = null;
if (remainder > )
{
value = source.Take((i + ) * number + offset + ).Skip(i * number + offset).ToList();
remainder--;
offset++;
}
else
{
value = source.Take((i + ) * number + offset).Skip(i * number + offset).ToList();
}
result.Add(value);
}
return result;
}

三.Task

           string message = string.Empty;
var listGroup = Test<ModelDemo>.AverageAssign(list,);
//信号量
var tokenSource = new CancellationTokenSource();
//先添加进Task数组,然后一起启动异步
//TaskFactory taskFactory = new TaskFactory();
//List<Task> taskList = new List<Task>();
//taskList.Add(taskFactory.StartNew(() =>
//{}
// Task.WaitAll(taskList.ToArray());
try
{ foreach (var group in listGroup)
{
Task.Factory.StartNew(() =>
{
if (tokenSource.Token.IsCancellationRequested)
{
Console.WriteLine("日志");
return;
} //要执行的方法
Print(group); }, tokenSource.Token); } }
catch (AggregateException aex)
{
tokenSource.Cancel();
foreach (var item in aex.InnerExceptions)
{
message += item.Message;
}
Console.WriteLine(message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

static void Print(List<ModelDemo> model)
{
  foreach (var item in model)
  {
    Console.WriteLine(item.Id);
  }
}

 

四.源码

https://github.com/gyw1309631798/MyTask

通过Task异步加快对数组的运算的更多相关文章

  1. C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>

    作者: 目录 一.缘由 二.使用向量类型 2.1 基本算法 2.2 使用大小固定的向量(如 Vector4) 2.2.1 介绍 2.2.2 用Vector4编写浮点数组求和函数 2.3 使用大小与硬件 ...

  2. Task异步编程

    Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...

  3. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

  4. Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...

  5. 5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组集合运算函数 1. array_merge() 函数 程序: <?php $array1 = array ...

  6. numpy数组的运算

    numpy数组的运算 数组的乘法 >>> import numpy as np >>> arr=np.array([[1,2,3],[4,5,6]]) >&g ...

  7. C# 将 Begin 和 End 异步方法转 task 异步

    在 .NET Framework 有两个不同的异步方法,一个是 Asynchronous Programming Model (APM) 另一个是 Task-based asynchronous pa ...

  8. c#中的Task异步编程

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/index翻译 1. 引入 Task异步 ...

  9. C++走向远洋——51(数组类运算的实现)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

随机推荐

  1. spark-submit提交参数设置

    /apps/app/spark-1.6.1-bin-hadoop2.6/bin/spark-submit --class com.zdhy.zoc2.sparksql.core.JavaSparkSq ...

  2. if 里面嵌套一个if&else (我自己又细分了别的条件,加了elif)

    场景: 一个陌生人敲门..... gender = input("你是男的是女的?") if gender == "女": print("请进&quo ...

  3. MySQL复制(二)Master-Slave复制实践

    1. 准备工作 首先要准备2台机器,分别安装mysql 我这里的版本是5.1.73,mysql数据库安装请参考:http://www.cnblogs.com/tangyanbo/p/4289753.h ...

  4. 微信小程序------导航栏样式、tabBar导航栏

    一:导航栏样式设置 小程序的导航栏样式在app.json中定义. 这里设置导航,背景黑色,文字白色,文字内容测试小程序 app.json内容: { "pages":[ " ...

  5. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...

  6. 700. Search in a Binary Search Tree

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  7. 2018年秋季学期《C语言程序设计I》教学过程及学期总结

    一学期下来,问题很多,思考也很多,需要整理.总结,好的经验要形成规律,不好的地方要提示警醒. 教学过程小结: C语言程序设计I-第一周教学 C语言程序设计I-第三周教学 C语言程序设计I-第四周教学 ...

  8. 带着问题学习openstack

    1.为什么要引入nova conductor, nova conductor 为什么接管了nova api RPC调用nova scheduler 的任务? nova-conductor:与数据库交互 ...

  9. Debian 8 安装录屏软件kazam

    1 安装 $ sudo apt-get install kazam [sudo] password for z: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完 ...

  10. ra寄存器定位core

    $ra寄存器中存入的是pc的值(程序运行处的地址),调用函数时,在跳转前,必须保存当前地址(pc的值),以便后来返回.jal $ra 保存后跳转,jr $ra,返回到跳转前,通过$ra保存进入上层栈地 ...