Task的用法学习(一)
来源:互联网 发布:沈阳 家具 盘古网络 编辑:程序博客网 时间:2024/06/05 22:50
using System;using System.Collections.Generic;using System.Threading.Tasks;using System.Threading;namespace TaskTest2{ class Program { static void Main(string[] args) { Console.WriteLine("任务初始化!"); EventHelper evtHelper = new EventHelper(); Task<bool> mainTask = Task.Factory.StartNew<bool>(() => { evtHelper.IsRuning = true; evtHelper.InitTask(); evtHelper.IsRuning = false; return true; }); Thread.Sleep(TimeSpan.FromSeconds(5)); Task sonTask = Task.Factory.StartNew(() => { Console.WriteLine("开始子任务!"); evtHelper.DoTask(); Console.WriteLine("任务完成!"); }); Console.ReadLine(); } } public class TaskModel { public int Index { set; get; } public string Name { set; get; } } public class EventHelper { TaskHelper th = new TaskHelper(); public bool IsRuning { set; get; } /// <summary> /// 最大并行任务数 /// </summary> const int MaxThreadNum = 5; /// <summary> /// 队列中允许的最大任务数 /// </summary> const int MaxTaskNum = 30; int TaskIndex = 0; public void InitTask() { for (int i = 0; i < 2000; i++) { TaskModel t = new TaskModel(); t.Index = i + 1; t.Name = "任务[" + t.Index + "]"; th.AddTask(t); Console.WriteLine("写入第{0}个任务!",t.Index); while (th.Count > MaxTaskNum) { Console.WriteLine("当前任务队列中的任务数为:{0},超过了允行并行的最大任务数:{1},线程等待中...",th.Count,MaxTaskNum); Thread.Sleep(TimeSpan.FromSeconds(1)); } } } public void DoTask() { while (IsRuning) { if (!th.IsQueueActive) { Thread.Sleep(TimeSpan.FromSeconds(2)); continue; } if (th.Count == 0) break; Console.WriteLine("队列中有{0}个任务!", th.Count); Task[] tasks = new Task[MaxThreadNum]; for (int i = 0; i < MaxThreadNum; i++) { tasks[i] = new Task(() => { DoSingleTask(TaskIndex); }); tasks[i].Start(); } Task.WaitAll(tasks); } } public void DoSingleTask(object obj) { if (th.IsQueueActive) { TaskModel tm = th.GetOneTask(); if (tm == null) return; Console.WriteLine("已经完成任务-----{0}", tm.Name); Thread.Sleep(TimeSpan.FromSeconds(1)); Interlocked.Increment(ref TaskIndex); } } } public class TaskHelper { public Queue<TaskModel> TaskList = new Queue<TaskModel>(); public void AddTask(TaskModel tm) { lock (this) { TaskList.Enqueue(tm); } } public TaskModel GetOneTask() { lock (this) { if (TaskList == null || TaskList.Count == 0) return null; return TaskList.Dequeue(); } } public void ClearList() { TaskList.Clear(); } public bool IsQueueActive { get { return TaskList.Count > 0; } } public int Count { get { return TaskList.Count; } } }}
0 0
- Task的用法学习(一)
- C#学习之Task 的用法1
- C#学习之Task 的用法2
- C#Task 学习 一
- C# Task的用法
- C++学习(一) auto的用法
- C#中Task的用法
- Task 用法
- gradle中的task(一)
- .NET Task揭秘(一)
- Hama学习笔记(6)-获取各个peer(task)的信息、确定master task
- Reduce Task的学习笔记
- Eclipse任务视图的用法(Task View)
- .net 多线程Task的一些基本用法
- 安卓学习笔记(一)Log的用法
- NopCommerce学习笔记(一)----IConfigurationSectionHandler 接口的用法
- spark源码学习(六)--- DAGScheduler中的task的划分
- spark源码学习(七);task任务的提交分析
- MySQL索引类型总结和使用技巧以及注意事项
- SuperMap iClient for JavaScript 时空数据动画的实现(二)
- 面试感悟----一名3年工作经验的程序员应该具备的技能
- MPU6050对卡尔曼、一阶互补滤波、二阶互补滤波的比较
- sax方式解析xml文档
- Task的用法学习(一)
- 路由套接字、密钥管理套接字、广播、多播
- Android网络加载通用LoadingView
- Android--打包工具,100个渠道包只需要10秒钟
- VS2013 NLPIR分词系统的使用及文本框多行显示
- Leetcode-longest-consecutive-sequence
- PHPMyadmin 配置
- stax方式解析xml文档
- missing artifact jdk.tools:jar:1.6