【多线程】Task

介绍

Task是.NET推出数据任务处理的工作类。位于System.Threading.Tasks命名空间下,通过命名空间也可以看出是个多线程类。

创建Task:

Task有很多构造函数,无参有参都有,想了解更多可以去官网查看。这里只介绍经常用的形式。

第一种:以类的实例化形式进行创建Task。通过实例化一个Task对象,然后Start,这种方式中规中矩。

 Task Task1 = new Task(() => Console.WriteLine("Task"));
            Task1.Start(); 

第二种:在实践中通常使用这种简洁形式,这种直接运行了Task不需要在start调用

Task.Run(() => Console.WriteLine("Task"));

第三种:通过Task的静态属性创建,然后直接启动。Factory提供对用于创建 Task 和 Task<TResult> 的工厂方法的访问。

     var t1= Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Task");
                });

判断执行状态:

通过IsCompleted属性可以查看当前task是否执行完成。

       var t11 = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Task");
                });
                if (t11.IsCompleted)
                {
                    Console.WriteLine("线程已经完成");
                }

等待控制:

通过WhenAny和WhenAll来控制等待,WhenAny表示任意一个Task完成之后,返回这个Task对象,但是有时候我们需要等待任务的完成,WhenAll表示处理完成之后,返回所有对象实例。例如:

List<Task<string>> TaskList = new List<Task<string>>() {
                Task.Factory.StartNew(()=> { return WriteHello(10); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(20); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(30); },C1.Token),
                Task.Factory.StartNew(()=> { return WriteHello(40); },C1.Token)
            };
            //var Reuslt= await Task.WhenAll(TaskList);
            var Reuslt = await Task.WhenAny(TaskList);
            if (Reuslt.IsCompleted)
            {
                Console.WriteLine("有人完成了");
            }

等待的时候,要加上async 和 await;

以上是异步等待,要想实现同步操作使用AwaitAll

         var t1 = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Task1");
                });
                var t2 = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Task2");
                });
                var t3 = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Task3");
                });

                //等待并行完成
                Task.WaitAll(t1, t2, t2, t3);

此时只有执行完成所有task后才会执行下面的代码。

原文地址:https://www.cnblogs.com/yanbigfeg/p/9186720.html

时间: 2024-11-06 14:31:06

【多线程】Task的相关文章

C# 多线程task

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace 多线程Task {     class Program     {         static void Main(string[] args)         {             Task

多线程-Task、await/async

Task创建无返回值 Task是.netframwork3.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚开始是一个edmx文件,现在的code first,ef轻量级.但是其他有的技术也是死掉了) Task具有线程执行的可控性,返回值,代码书写简单,性能好等特点. Task创建主要有三种方式 1.Task参数 Task t = new Task(() => { for (int i = 0; i <

多线程--Task,等待用户输入AutoResetEvent

上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5. 4.0也行,但不成熟.Thread引用2.0就够了. 1.通过构造函数创建的task,必须手动Start,而通过工厂创建的Task直接就启动了. var task1 = new Task(() => {    }); task.Start(); var task2 = Task.Factory.StartNew(() =>{    }); Task[] tasks =

多线程——Task

背景: 以前想用Semaphore来处理并发访问资源的问题,后来把方案拿给前辈们看的时候,他们说这样也行,但是最好用Task处理,比较简单.所以,顺便学习了下Task. 使用task类创建并执行简单任务 等待任务的完成并获取返回值 使用ContinueWith方法在任务完成时启动一个新任务 创建父子任务和任务工厂的使用 <span style="font-size:12px;">namespace 创建父子任务和任务工厂的使用 { class Program { //通过t

线程——自定义多线程task

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp7 { public class TaskManage { public int maxcount; public int countnum = 0; public TaskMan

.NET(C#):await返回Task的async方法

一.  FrameWork 4.0之前的线程世界    在.NET FrameWork 4.0之前,如果我们使用线程.一般有以下几种方式: 使用System.Threading.Thread 类,调用实例方法Start()开启一个新线程,调用Abort()方法来提前终止线程. 使用System.Threading.ThreadPool类,调用静态方法QueueUserWorkItem(),将方法放入线程池队列,线程池来控制调用. 使用BeginInvoke,EndInvoke,BeginRead

8异步和多线程

1,.NET 中实现异步的方式是使用委托的beginInvoke方法. 使用异步之后.net会创建一个线程来异步执行方法操作,主线程会继续执行程序逻辑.如果在异步执行中有回调函数,在异步方法执行完之后执行异步调用的线程回再执行回调函数中的代码. 1,首先创建一个比较耗时的私有方法用以作为异步执行的代码,后续的多线程执行代码使用的也是该代码. 1 /// <summary> 2 /// 一个比较耗时耗资源的私有方法 3 /// </summary> 4 /// <param n

委托的高级使用

多播委托(multicast)一个委托里面包含了不止一个方法 static void Main(string[] args) { Student stu1 = new Student() { ID=1,PenColor=ConsoleColor.Yellow}; Student stu2 = new Student { ID = 2, PenColor = ConsoleColor.Green }; Student stu3 = new Student { ID = 3, PenColor =

多线程系列(3)任务Task

虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章我从以下几点对Task进行总结. 认识Task Task的用法 认识Task Task类在命名空间System.Threading.Tasks下,通过Task的Factory返回TaskFactory类,以TaskFactory.StartNew(Action)方法可以创建一个新的异步线程,所创建的

多线程随笔二(Task)

Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task启动主要有以下几种用法: 1.构造Task对象,启动Task 1 Task myTask = new Task(DoSomething); 2 myTask.Start(); 2.通过Task.Factory启动Task Task second = Task.Factory.StartNew(DoS