架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 20540|回复: 0

[资料] 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕

[复制链接]
发表于 2016-4-26 11:28:07 | 显示全部楼层 |阅读模式
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;

  5. namespace Ex.RulesTester.Threads
  6. {
  7.     /// <summary>
  8.     /// 异步等待所有线程结束通知测试
  9.     /// </summary>
  10.     [TestClass]
  11.     public class TaskAllCompleteTester
  12.     {
  13.         [TestMethod]
  14.         public void TestTaskPoolStatus()
  15.         {
  16.             //运行异步多任务
  17.             TaskTest.RunTask();
  18.             var list = TaskTest.SuccessList;
  19.             bool isAllComplete = false;
  20.             //等待异步通知
  21.             while (!isAllComplete)
  22.             {
  23.                 isAllComplete = TaskTest.IsAllComplete;
  24.                 list = TaskTest.SuccessList;
  25.             }

  26.             Assert.IsTrue(true);
  27.         }
  28.         /// <summary>
  29.         /// 对于 task 多任务执行的封装
  30.         /// </summary>
  31.         private class TaskTest
  32.         {
  33.             private static object m_lock = new object();
  34.             public static List<string> SuccessList = new List<string>();
  35.             private static string msg = "";
  36.             public static bool IsFinish = false;
  37.             public static List<Task> TaskList = new List<Task>();
  38.             static bool isAllComplete = false;
  39.             /// <summary>
  40.             /// 标记所有任务是否全部执行完毕
  41.             /// </summary>
  42.             public static bool IsAllComplete
  43.             {
  44.                 get { return isAllComplete; }
  45.             }

  46.             private TaskTest()
  47.             {

  48.             }

  49.             public static void RunTask()
  50.             {
  51.                 //运行5个任务
  52.                 for (int i = 1; i <= 5; i++)
  53.                 {
  54.                     var task = Task.Factory.StartNew(DoTask, i);
  55.                     TaskList.Add(task);
  56.                 }
  57.                 //异步等待所有任务执行完毕
  58.                 Task.Factory.StartNew(x =>
  59.                 {
  60.                     Task.WaitAll(TaskList.ToArray());
  61.                     //标记所有任务运行完成
  62.                     isAllComplete = true;
  63.                 }, null);
  64.             }
  65.             private static void DoTask(object par)
  66.             {
  67.                 Thread.Sleep(int.Parse(par.ToString()) * 1000);
  68.                 lock (m_lock)
  69.                 {
  70.                     SuccessList.Add("Has Completed T" + par.ToString());
  71.                 }
  72.             }

  73.         }
  74.     }
  75. }
复制代码






上一篇:c#线程池执行操作例子
下一篇:jquery ajax会带cookies session请求吗?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-5-28 10:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表