C# 应用 - 多线程 3) Task.Factory
1. 与 Task.Run() 的区别;
先看一下源码:
public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable
{
public static Task Run(Action action)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
return InternalStartNew(null, action, null,
default(CancellationToken),
TaskScheduler.Default,
TaskCreationOptions.DenyChildAttach,
InternalTaskOptions.None,
ref stackMark);
}
internal static Task InternalStartNew(Task creatingTask, Delegate action, object state,
CancellationToken cancellationToken,
TaskScheduler scheduler,
TaskCreationOptions options,
InternalTaskOptions internalOptions,
ref StackCrawlMark stackMark)
{
if (scheduler == null)
{
throw new ArgumentNullException("scheduler");
}
Task task = new Task(action, state, creatingTask, cancellationToken, options, internalOptions | InternalTaskOptions.QueuedByRuntime, scheduler);
task.PossiblyCaptureContext(ref stackMark);
task.ScheduleAndStart(needsProtection: false);
return task;
}
...
}
public class TaskFactory
{
public Task StartNew(Action action)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
Task internalCurrent = Task.InternalCurrent;
return Task.InternalStartNew(internalCurrent, action, null,
m_defaultCancellationToken,
GetDefaultScheduler(internalCurrent),
m_defaultCreationOptions,
InternalTaskOptions.None,
ref stackMark);
}
public Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
return Task.InternalStartNew(Task.InternalCurrentIfAttached(creationOptions), action, null,
cancellationToken,
scheduler,
creationOptions,
InternalTaskOptions.None,
ref stackMark);
}
...
}
Task.Run() 是 .Net Framework 4.5 之后提出的,Task.Factory.StartNew() 可以使用更多的参数,可以认为 Task.Run 是简化版的使用,而 Task.Factory.StartNew() 主要用于需要指定该线程是长期占用的,否则用 task.Run
Task.Factory.StartNew(()=>{
...
}, TaskCreationOptions.LongRunning
);
TaskCreationOptions.LongRunning 它会向 System.Threading.Tasks.TaskScheduler提示,
过度订阅可能是合理的。
可以通过过度订阅创建比可用硬件线程数更多的线程。
它还将提示任务计划程序:该任务需要附加线程,以使任务不阻塞本地线程池队列中其他线程或工作项的向前推动。
2. CancellationToken 入参:取消令牌;
可参考 https://www.cnblogs.com/MichaelLoveSna/p/14507488.html
3. TaskCreationOptions 入参:父子之间的依附态度等;
TaskCreationOptions.LongRunning;
TaskCreationOptions.AttachedToParent;
TaskCreationOptions.DenyChildAttach;
TaskCreationOptions.AttachedToParent 表示该 Task 可以依附在父 Task 上,
当父 Task wait 的时候,会等待该 Task 执行完毕;
TaskCreationOptions.DenyChildAttach 就是为了避免子 Task 设置 TaskCreationOptions.AttachedToParent,
强行拒绝依附。
这一对有点像,儿子:爸,等我;父亲说:别闹,我没有你这个儿子。
4. TaskScheduler :线程调度
TaskScheduler.Default 线程池的线程
TaskScheduler.FromCurrentSynchronizationContext() 用了运行在一个与当前函数相同的线程中(也就是UI线程中,除非是 Task 的 Task)
这个描述可能听起来有点抽象,需要意会一下。
C# 应用 - 多线程 3) Task.Factory的更多相关文章
- Task.Factory.StartNew多线程中将数值实时传递到UI显示
private void button1_Click(object sender, EventArgs e) { Task t1 = Task.Factory.StartNew(() => k1 ...
- C# Task.Run 和 Task.Factory.StartNew 区别
Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制.可以认 ...
- .Net 多线程 (1) Task
多线程是一种有效提高程序工作效率的方法.当然为了效率需要使用更多的cpu,内存等资源. 并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前 ...
- 【多线程】Task
介绍 Task是.NET推出数据任务处理的工作类.位于System.Threading.Tasks命名空间下,通过命名空间也可以看出是个多线程类. 创建Task: Task有很多构造函数,无参有参都有 ...
- 【多线程】 Task
[多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...
- Task.Factory.StartNew的用法
代码: private void button5_Click(object sender, EventArgs e) { ; Task.Factory.StartNew(() => { Mess ...
- Task.Run Vs Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task.Run Vs Task.Factory.StartNew z
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- 多线程(4)Task
使用线程池使得创建线程已经很简单了,但是使用线程池不支持线程的取消,完成和失败通知等交互操作,为了解决这些问题,.net 4.0带来了TPL(Task Parallel Library)任务并行库,下 ...
随机推荐
- Redis面试常见问题(一)
一.redis 简介简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向.另外,redis 也经 ...
- 初学算法之dijkstra
dijkstra的代码思想网上各路高手所述备矣.这里只是存下用邻接矩阵和邻接表实现的dijkstra.(白书代码) 邻接矩阵 1 void dijkstra(int s){ 2 int dis[s]= ...
- 关于TCP和UDP的通俗理解
TCP和UDP是网络基础,很多公司面试也都会问到,今天我在这里,根据大神们的讲解,自己总结借鉴一下. 首先,先提一个问题:英雄联盟是TCP还是UDP? 这个问题对于游戏玩家,可能大多数人都没有想过.一 ...
- ffmpeg开发环境搭建--(linux)
1. 下载源码: http://ffmpeg.org/download.html 2. 解压:tar –xvf ffmpeg-3.2.1.tar.bz2 3. 配置 Eg:./ ...
- SVG path d Attribute
Scalable Vector Graphics (SVG) 1.1 (Second Edition) W3C Recommendation 16 August 2011 http://www.w3. ...
- 如何强制删除 baidu/tempdata/con.dat 的垃圾文件! How to fix locked SD card: 读卡器 损坏,补救措施!
https://www.youtube.com/watch?v=y2c37dcxNto&feature=youtu.be 使用windows command prompt 强制删除 baidu ...
- js 金融数字格式化
js 金融数字格式化 finance money number format 数字格式化 regex `123456789`.replace(/\B(?=(\d{3})+(?!\d))/g, ',') ...
- uniapp 发起网络请求
推荐下我写的uni-http 创建http-config.js import Vue from 'vue' const BASE_URL = 'http://xxx.com'; if (process ...
- java数据类型(进阶篇)
public class note03 { public static void main(String[] args) { //数据类型拓展 //1.整数拓展 //进制: 二进制0b 十进制 八进制 ...
- Vue 组件的通信方式都有哪些?
说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1props ...