使用 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 = 1; i <= 5; 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()) * 1000);
                lock (m_lock)
                {
                    SuccessList.Add("Has Completed T" + par.ToString());
                }
            }

        }
    }
}
时间: 2024-10-17 04:22:24

使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕的相关文章

异步编程和线程的使用(.NET 4.5 )

C#:异步编程和线程的使用(.NET 4.5 ) 异步编程和线程处理是并发或并行编程非常重要的功能特征.为了实现异步编程,可使用线程也可以不用.将异步与线程同时讲,将有助于我们更好的理解它们的特征. 本文中涉及关键知识点 1. 异步编程 2. 线程的使用 3. 基于任务的异步模式 4. 并行编程 5. 总结 异步编程 什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程.通常情况下,C#程序从Main方法开始,当Main方法返回时结束.所有的操作都是按顺序执行的.执行操

异步编程、线程和任务

用鼠标操作,我们习惯了延迟,过去几十年都是这样.有了触摸UI,应用程序要求立刻响应用户的请求. C#5.0提供了更强大的异步编程,仅添加了两个新的关键字:async和await. 使用异步编程,方法调用是在后头运行(通常在线程和任务的帮助下),并且不会阻塞调用线程. => 所以 异步编程应该就是使用线程和任务进行编程. 另外,异步委托也是在线程和任务的帮助下完成的,它是基于事件的异步模式. 1.首先先了解一个概念:(WPF的,应该和WindowsForm差不多) 在WindowsForm和WPF

C#:异步编程和线程的使用(.NET 4.5 )

C#:异步编程和线程的使用(.NET 4.5 ) 异步编程和线程处理是并发或并行编程非常重要的功能特征.为了实现异步编程,可使用线程也可以不用.将异步与线程同时讲,将有助于我们更好的理解它们的特征. 本文中涉及关键知识点 1. 异步编程 2. 线程的使用 3. 基于任务的异步模式 4. 并行编程 5. 总结 异步编程 什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程.通常情况下,C#程序从Main方法开始,当Main方法返回时结束.所有的操作都是按顺序执行的.执行操

异步调用与线程(总结篇)

委托调用.子线程程调用.与线程池调用1,委托调用(1),同步委托:委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 从下面的例子中可以看到,同步委托的执行是在主线程main中执行的,所以当执行委托时,当前工作会处于等待状态,开始执行委托,当委托执行完后在继续执行“当前工作” public delegate int AddHandler(int i,int y);        private void button1_C

改善C#程序的建议9:使用Task代替ThreadPool和Thread

一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互性操作: 2: ThreadPool不支持线程执行的先后次序: 以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task.Task在线程池的基础上进行了优化,并提供了更多的API.在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的

线程池之ThreadPool类与辅助线程 - &lt;第二篇&gt;

一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线程反复利用(线程池初始化时没有线程,有程序请求线程则创建线程): 最好不要销毁而是挂起线程达到避免性能损失(线程池创建的线程完成任务后以挂起状态回到线程池中,等待下次请求): 通过一个技术达到让应用程序一个个执行工作,类似于一个队列(多个应用程序请求线程池,线程池会将各个应用程序排队处理): 如果某一线程长时间挂起而不工作的话,需要彻底销毁并且释放资源(线程池自动监控长时间不工作的线程,自动销毁): 如果线程不够用的话能够创建

线程池 异步I/O线程 &lt;第三篇&gt;

在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一个线程,当线程正在处理UI操作时就会出现“卡”的现象. 如果使用异步的处理方式,则这三步处理过程涉及到两个线程,主线程中启动第一步:第一步启动后,主线程结束(如果不结束,只会让该线程处于无作为的等待状态):第二步不需要CPU参与:第二步完成之后,在第二个线程上启动第三步:完成之后第二个线程结束.这样

编写高质量代码改善C#程序的157个建议——建议80:用Task代替ThreadPool

建议80:用Task代替ThreadPool ThreadPool相对于Thread来说具有很多优势,但是ThreadPool在使用上却存在一定的不方便.比如: ThreadPool不支持线程的取消.完成.失败通知等交互性操作. ThreadPool不支持线程执行的先后次序. 以往,如果开发者要实现上述功能,需要完成很多额外的工作.现在,FCL中提供了一个功能更强大的概念:Task.Task在线程池的基础上进行了优化,并提供了更多的API.在FCL 4.0中,如果我们要编写多线程程序,Task显

.Net Core WebAPI 基于Task的同步&amp;异步编程

await 和 async  异步的实质就是线程的切换(遇到await),同一请求下,异步和同步的执行时间是一样的,但有人说异步可以提高XXX性能,但具体是什么性能呢?又说不上来,其实就只提高并发量,并不能提升你应用程序处理的速度 使用异步的目的是用尽量少的线程保证相同的并发量. 线程的总数少了,线程切换消耗的资源就小了,相对来提供给客户任务的资源就多了,性能就在这里. CPU 在大量线程的情况下,20%的时间片在线程切换上,客户任务有80%的资源使用. 减少了线程数,只有5%的时间片消耗在线程