对任务执行目标数据
2016-02-17 13:09
176 查看
对任务执行目标数据,在实现回调方法时注意加锁控制。
[csharp]
namespace XXXXXXX
{
#region using directives
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
#endregion using directives
public class MultiTaskExecutor<T>
{
public delegate void TaskExecutor(IEnumerable<T> assignTaskDataSet);
private readonly object locker = new object();
private readonly int multiTaskNumber;
private List<Task> tasks = new List<Task>();
public MultiTaskExecutor(int multiTaskNumber = 10)
{
this.multiTaskNumber = multiTaskNumber;
}
public void AssignTask(IEnumerable<T> taskDataSet, TaskExecutor taskExecutor)
{
lock (this.locker)
{
if (taskDataSet == null)
{
throw new ArgumentNullException("taskDataSet");
}
if (this.multiTaskNumber < 1)
{
throw new ArgumentException("The value of MultiTaskNumber must be greater than zero.");
}
var taskDataList = taskDataSet as IList<T> ?? taskDataSet.ToList();
if (!taskDataList.Any())
{
return;
}
var taskCount = taskDataList.Count();
var perTaskDataNumber = taskCount/this.multiTaskNumber;
var lastTaskRemainDataNumber = taskCount%this.multiTaskNumber;
this.tasks = new List<Task>();
var currentTaskDataIndex = 0;
for (var taskId = 0; taskId < this.multiTaskNumber; taskId++)
{
// DEBUG
//var debugStartIndex = currentTaskDataIndex;
var assignTaskDataSet = new List<T>();
if (taskId == this.multiTaskNumber - 1)
{
for (var i = 0; i < perTaskDataNumber + lastTaskRemainDataNumber; i++)
{
assignTaskDataSet.Add(taskDataList[currentTaskDataIndex]);
currentTaskDataIndex++;
}
}
else
{
for (var i = 0; i < perTaskDataNumber; i++)
{
assignTaskDataSet.Add(taskDataList[currentTaskDataIndex]);
currentTaskDataIndex++;
}
}
// DEBUG
//Console.WriteLine("Current Task ID: {0}, [{1}, {2})", taskId, debugStartIndex, currentTaskDataIndex);
var task = new Task(() => taskExecutor(assignTaskDataSet));
this.tasks.Add(task);
}
}
}
public async Task Execute()
{
foreach (var task in this.tasks)
{
task.Start();
}
await Task.WhenAll(this.tasks.ToArray());
}
}
}
[/csharp]
查看原文:http://nap7.com/me/multi-task-run-job/
[csharp]
namespace XXXXXXX
{
#region using directives
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
#endregion using directives
public class MultiTaskExecutor<T>
{
public delegate void TaskExecutor(IEnumerable<T> assignTaskDataSet);
private readonly object locker = new object();
private readonly int multiTaskNumber;
private List<Task> tasks = new List<Task>();
public MultiTaskExecutor(int multiTaskNumber = 10)
{
this.multiTaskNumber = multiTaskNumber;
}
public void AssignTask(IEnumerable<T> taskDataSet, TaskExecutor taskExecutor)
{
lock (this.locker)
{
if (taskDataSet == null)
{
throw new ArgumentNullException("taskDataSet");
}
if (this.multiTaskNumber < 1)
{
throw new ArgumentException("The value of MultiTaskNumber must be greater than zero.");
}
var taskDataList = taskDataSet as IList<T> ?? taskDataSet.ToList();
if (!taskDataList.Any())
{
return;
}
var taskCount = taskDataList.Count();
var perTaskDataNumber = taskCount/this.multiTaskNumber;
var lastTaskRemainDataNumber = taskCount%this.multiTaskNumber;
this.tasks = new List<Task>();
var currentTaskDataIndex = 0;
for (var taskId = 0; taskId < this.multiTaskNumber; taskId++)
{
// DEBUG
//var debugStartIndex = currentTaskDataIndex;
var assignTaskDataSet = new List<T>();
if (taskId == this.multiTaskNumber - 1)
{
for (var i = 0; i < perTaskDataNumber + lastTaskRemainDataNumber; i++)
{
assignTaskDataSet.Add(taskDataList[currentTaskDataIndex]);
currentTaskDataIndex++;
}
}
else
{
for (var i = 0; i < perTaskDataNumber; i++)
{
assignTaskDataSet.Add(taskDataList[currentTaskDataIndex]);
currentTaskDataIndex++;
}
}
// DEBUG
//Console.WriteLine("Current Task ID: {0}, [{1}, {2})", taskId, debugStartIndex, currentTaskDataIndex);
var task = new Task(() => taskExecutor(assignTaskDataSet));
this.tasks.Add(task);
}
}
}
public async Task Execute()
{
foreach (var task in this.tasks)
{
task.Start();
}
await Task.WhenAll(this.tasks.ToArray());
}
}
}
[/csharp]
查看原文:http://nap7.com/me/multi-task-run-job/
相关文章推荐
- 【SPOJ-MIFF】Matrix inverse【高斯消元】
- Android闪光灯开关
- 有感于小米官网的中英文版本号的差异
- 动态加载JavaScript文件
- 沙盒(SandBox)
- Wamp安装redis扩展和window安装redis-service(此文只针对学习redis)
- JS寻找公共项
- UML--状态图、活动图
- @Override覆盖不了spring-web.jar中的方法
- Android使用java的Math.Random获取随机色值
- 多层次资本市场
- 2.7-1 Android Studio 相关的配置信息,未整理
- 2.3笔记-循环链表
- 设计模式学习书推荐
- leetcode 8. String to Integer (atoi)
- cxf jax-rs client 笔记
- Python 爬虫爬取指定博客的所有文章
- 【中级篇】puppet部署与应用
- 12种JavaScript MVC框架之比较
- 自定义 Java Annotation