C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; namespace Ex.RulesTester.Threads
{
/// <summary>
/// 异步等待所有线程结束通知测试
/// </summary>
[TestClass]
public class TaskAllCompleteTester
{
[TestMethod]
public void TestTaskPoolStatus()
{
//运行异步多任务
TaskTest.RunTask();
var list = TaskTest.SuccessList;
bool isAllComplete = false;
//等待异步通知
while (!isAllComplete)
{
isAllComplete = TaskTest.IsAllComplete;
list = TaskTest.SuccessList;
} Assert.IsTrue(true);
}
/// <summary>
/// 对于 task 多任务执行的封装
/// </summary>
private class TaskTest
{
private static object m_lock = new object();
public static List<string> SuccessList = new List<string>();
private static string msg = "";
public static bool IsFinish = false;
public static List<Task> TaskList = new List<Task>();
static bool isAllComplete = false;
/// <summary>
/// 标记所有任务是否全部执行完毕
/// </summary>
public static bool IsAllComplete
{
get { return isAllComplete; }
} private TaskTest()
{ } public static void RunTask()
{
//运行5个任务
for (int i = ; i <= ; i++)
{
var task = Task.Factory.StartNew(DoTask, i);
TaskList.Add(task);
}
//异步等待所有任务执行完毕
Task.Factory.StartNew(x =>
{
Task.WaitAll(TaskList.ToArray());
//标记所有任务运行完成
isAllComplete = true;
}, null);
}
private static void DoTask(object par)
{
Thread.Sleep(int.Parse(par.ToString()) * );
lock (m_lock)
{
SuccessList.Add("Has Completed T" + par.ToString());
}
} }
}
}
C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕的更多相关文章
- Delegate、Thread、Task、ThreadPool几种方式创建异步任务性能对比
开始预测的结果是 Task>Delegate>ThreadPool>>Thread. (一)测试代码 static async Task<int> AsyncTas ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- Task 和 ThreadPool
在C#中 TASK 和 ThreadPool 都可以完成多任务并行的工作.但是 TASK实际上是微软定义好的,基于 ThreadPool 的一个类.这里面微软做了很多优化工作. Task Parall ...
- Task/Parallel实现异步多线程
代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...
- .Net Core WebAPI 基于Task的同步&异步编程快速入门
.Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...
- task 异步 进程与线程的区别
用Wait方法(会以同步的方式来执行),不用Wait则会以异步的方式来执行 要在主线程中等待后台线程执行完毕,可以使用Wait方法(会以同步的方式来执行).不用Wait则会以异步的方式来执行. Tas ...
- SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务
============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- [No0000181]改善C#程序的建议9:使用Task代替ThreadPool和Thread
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...
随机推荐
- n阶方阵A可逆充分必要条件
n阶方阵A可逆 充分必要条件:<=> A非奇异(非奇异矩阵就是对应的行列式不等于等于0的方阵)<=> |A|≠0 <=> r(A) = n <=> A的 ...
- Python之Cookielib
cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.Cookielib模块非常强大,我们可以利用本模块的CookieJar类的 ...
- java多线程 21 : ReentrantReadWriteLock ,synchronized和ReentrantLock的对比
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...
- django 事务错误 -- Transaction managed block ended with pending COMMIT/ROLLBACK
Request Method: GET Request URL: http://192.168.128.111:8000/×××/××××/ Django Version: 1.4.8 Excepti ...
- Eigen教程(9)
整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html Eigen并没有为matrix提供直接的Reshape和Slicing的API,但是 ...
- Android 面试知识集2
继续上一篇文章整理有关Android的基础知识,为面试做准备的可以看看哪些知识是遗漏了.资料都是网上整理来,纠正了一些错误,有部分解析加入个人理解!感谢分享相关知识的开发者.这些知识平常开发的过程中都 ...
- Teleport Pro使用教程
Teleport Pro使用教程 经常有不少网友来信询问,问如何做才可以把整个站点复制到硬盘上慢慢看,或者问teleportPro的使用方法.的确,离线浏览工具对于大部分网民来说是一个不错的工具,除非 ...
- drupal 内容类型
一.drupal核心下载 https://drupal.org/download 3二.下载中文语言包 https://localize.drupal.org 图1,图2 也可以直接点击:https: ...
- Extjs4.x (MVC)Controller中refs以及Ext.ComponentQuery解析
refs : Object[]5 Array of configs to build up references to views on page. For example: Ext.define(& ...
- 【C】——如何生成静态库和动态库
对于一个编译型语言,编译器工作时总要经过预处理.编译.链接等几个过程.以 C/C++ 为例:预处理器(cpp)将每个 .c/.cpp 文件中 #include 的头文件都合并到 .c/.cpp 文件中 ...