【多线程】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");
});
StartNew和Run区别
这两个应用的场景都是一样的,只不过Run是StartNew的再次封装吧,与之相比Run比StartNew自动执行了Unwrap。
Unwrap:主要的作用就是会把嵌套在Task或者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(); },C1.Token),
Task.Factory.StartNew(()=> { return WriteHello(); },C1.Token),
Task.Factory.StartNew(()=> { return WriteHello(); },C1.Token),
Task.Factory.StartNew(()=> { return WriteHello(); },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后才会执行下面的代码。
死锁问题
此代码仅作保存研究
出现死锁:
#region 并行死锁问题
public static void ParallelLock()
{
var t1 = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 1 Start running...");
while (true)
{
System.Threading.Thread.Sleep(1000);
}
Console.WriteLine("Task 1 Finished!");
});
var t2 = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 2 Start running...");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Task 2 Finished!");
});
Task.WaitAll(t1, t2);
}
#endregion
解决办法:
#region 解决死锁问题
/// <summary>
/// 解决死锁问题设置时间
/// </summary>
public static void ParallelLockEnd()
{
Task[] tasks = new Task[];
tasks[] = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 1 Start running...");
while (true)
{
System.Threading.Thread.Sleep();
}
Console.WriteLine("Task 1 Finished!");
});
tasks[] = Task.Factory.StartNew(() =>
{
Console.WriteLine("Task 2 Start running...");
System.Threading.Thread.Sleep();
Console.WriteLine("Task 2 Finished!");
}); Task.WaitAll(tasks, );
for (int i = ; i < tasks.Length; i++)
{
if (tasks[i].Status != TaskStatus.RanToCompletion)
{
Console.WriteLine("Task {0} Error!", i + );
}
}
Console.Read();
}
#endregion
【多线程】Task的更多相关文章
- .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)
一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...
- 多线程Task
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C# 多线程task
1.异步和多线程的区别?没什么太大区别.异步是目的,使用多线程实现.想想AJAX异步加载,不就是不想让浏览器界面卡住嘛,所以在程序中对于某些单独的操作,比如写日志,我们不想等它完成后再执行其它操作(因 ...
- 多线程--Task,等待用户输入AutoResetEvent
上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5. 4.0也行,但不成熟.Thread引用2.0就够了. 1.通过构造函数创 ...
- [.net 多线程]Task
C# 异步编程Task整理(一) c# .Net并行和多线程编程之Task学习记录! .NET 实现并行的几种方式(一) Dispatcher介绍 [C#学习笔记]使用C#中的Dispatcher 用 ...
- 多线程-Task、await/async
Task创建无返回值 Task是.netframwork4.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚 ...
- 线程——自定义多线程task
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 异步多线程 Task理解
一.简介 Task是.NET Framework4.0 TPL(任务并行库)提供的新的操作线程池线程的封装类.它提供等待.终止(取消).返回值.完成通知.失败通知.控制执行的先后次序等优化线程操作功能 ...
- C#多线程---Task实现异步
一.场景 使用Task来进行累加操作. 二.例子-Task使用 1 using System; 2 using System.Collections.Generic; 3 using System.L ...
- .Net 多线程 异步编程 Await、Async和Task
await和async简介 await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...
随机推荐
- java生成pdf文件 --- Table
Java利用itext实现导出PDF文件 所需要的jar包:com.lowagie.text_2.1.7.v201004222200.jar jar包下载地址:http://cn.jarfire.or ...
- IText实现对PDF文档属性的基本设置
一.Itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...
- Python开发——4.集合和字符串拼接
一.集合(set) 1.集合的特性: 不同元素组成.元素是无序排列的可hash值 2.集合转为列表 s1 = {11,"hechouzi",(11,22,33)} names = ...
- 向jsp中引入公共文件
前沿,在网页开发中,总会存在某几个.js或者某几个.css是所有.jsp文件的公用文件,为了方便引用 我们把这些在公共的.js及.css文件放到一个.jsp文件中,只需要将这个引入所有公共.js及.c ...
- 24.HashSet
在前篇博文(HashMap)中详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素.所以如果对HashMap比较熟悉,那么Has ...
- AJPFX:什么是外汇交易
外汇交易是对货币对的一种买卖,是以一个国家货币与另外一个国家货币进行交换,即您在买入一国货币的同时,您也卖出了另一国的货币.所以在外汇市场上,人们的交易对象就是“货币对“,比如欧元/美元,美元/日元, ...
- Javascript百学不厌 - 尾递归
虽然偶尔也用过,但是从来没具体来整理过 普通递归: function fac(n) { ) ; ); } fac() 这是个阶乘.但是占用内存,因为: fac(5) (5*fac(4)) (5*(4* ...
- GraphQL:你的容颜,十万光年
What? GraphQL 是一种类似于 SQL 的结构化查询语言,由 facebook 于2012年创造,于2015年开源.SQL 在服务端定义,GraphQL 在客户端定义,也就是说 GraphQ ...
- OpenGL ES: 纹理采样 texture sample
Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...
- Dispatch Queue 之 dispatch_async
 可以看到,在queue里的任务,不仅仅是一个函数,也可以是一个其他的queue. 下面是一个例子.  全局队列的处理 一般一个全局队列有多个线程,这些个线程会遍历并处理链表里的任务. 对于全局队 ...