C#--Task知识点
2024-08-31 04:31:06
Task是什么,字面意思是任务
表示一个异步操作。它是异步操作的首选方式。Task是FRAMEWORK4中的新特性,封装了以前的Thread,并管理Thread。
任务和线程的区别:
- 任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
- 任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。
关于task的一个前台线程特点
不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task管理其他的都是后台线程。有点不好理解,直接记住,task需要一个前台线程运行就行了。
task对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。
生命周期
Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。 //所以在start的时候,是没有开始执行的,在wait之后才开始执行
RanToCompletion:任务执行完毕。
Task.start,TaskFactory.StartNew,Task.RUn
Task.Run Task.Run则是等线程池空闲后在执行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Task t1 = new Task(speak);
t1.Start();
t1.Wait();
//使用Task.Factory.StartNew创建任务
Task t2 = Task.Factory.StartNew(speak);
//wait函数意味着
//t2.Wait();
//使用new的方法创建任务
Task t3 = new Task(speak);
t3.Start();
//t3.Wait();
//也可以这样,让两个任务同时执行
Task.WaitAll(t2, t3);
Task.Run(() => Console.WriteLine("您的数值已经被提交了"));
Console.ReadKey();
}
static void speak()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i + "的时间是" + DateTime.Now + "线程的id是" + Thread.CurrentThread.ManagedThreadId);
}
Thread.Sleep(2000);
}
}
}
Task.Wait,Task.Wait,Task.WaitAny不写了
Task.ContinueWith
static void Main(string[] args)
{
var task1 = new Task(() =>
{
Console.WriteLine("Task 1 Begin");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Task 1 Finish");
});
var task2 = new Task(() =>
{
Console.WriteLine("Task 2 Begin");
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Task 2 Finish");
});
task1.Start();
task2.Start();
var result = task1.ContinueWith<string>(task =>
{
Console.WriteLine("task1 finished!");
return "This is task result!";
});
Console.WriteLine(result.Result.ToString());
Console.Read();
}
Task的取消
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(1000);
if (token.IsCancellationRequested)
{
Console.WriteLine("Abort mission success!");
return;
}
}
}, token);
token.Register(() =>
{
Console.WriteLine("Canceled");
});
Console.WriteLine("Press enter to cancel task...");
Console.ReadKey();
tokenSource.Cancel();
最新文章
- MVC之Model转Json
- php中并发读写文件冲突的解决方案
- 阿里社招B2B
- ASP.NET 客户端静态文件请求设置缓存(Client Cache)
- 【hibernate criteria】hibernate中criteria的完整用法 转
- 适应各浏览器图片裁剪无刷新上传jQuery插件(转)
- 【转】如何使用KeyChain保存和获取UDID
- 以C#编写的Socket服务器的Android手机聊天室Demo
- JLink 在J-Flash ARM批处理自动下载
- QDomDocument类
- 基于visual Studio2013解决C语言竞赛题之0502最小数替换
- Oracle 收集统计数据
- 浅析mydumper
- 使用abcpdf分页设置的问题
- jquery为表格行添加上下移动画效果
- 【Java并发编程】7、线程池
- Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置
- Python3基础 __setattr__ 在属性被赋值的时候,新增提示功能
- 对io进行分流
- linux将指令加入开机启动或加入环境变量
热门文章
- CodeForces 754D Fedor and coupons&;&;CodeForces 822C Hacker, pack your bags!
- bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs
- 97. ExtJS之EditorGridPanel afteredit属性
- Error creating bean with name "; ";问题
- Greenplum使用教程
- Docker容器的使用和连接
- golang struct里面的字段,或者slice排序
- HTML <;!DOCTYPE>;标签
- lua 10进制转换成其它进制table表示
- (转)Vue 爬坑之路(二)—— 组件之间的数据传递