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的更多相关文章

  1. Task.Factory.StartNew多线程中将数值实时传递到UI显示

    private void button1_Click(object sender, EventArgs e) { Task t1 = Task.Factory.StartNew(() => k1 ...

  2. C# Task.Run 和 Task.Factory.StartNew 区别

    Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制.可以认 ...

  3. .Net 多线程 (1) Task

    多线程是一种有效提高程序工作效率的方法.当然为了效率需要使用更多的cpu,内存等资源. 并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前 ...

  4. 【多线程】Task

    介绍 Task是.NET推出数据任务处理的工作类.位于System.Threading.Tasks命名空间下,通过命名空间也可以看出是个多线程类. 创建Task: Task有很多构造函数,无参有参都有 ...

  5. 【多线程】 Task

    [多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...

  6. Task.Factory.StartNew的用法

    代码: private void button5_Click(object sender, EventArgs e) { ; Task.Factory.StartNew(() => { Mess ...

  7. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  8. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  9. 多线程(4)Task

    使用线程池使得创建线程已经很简单了,但是使用线程池不支持线程的取消,完成和失败通知等交互操作,为了解决这些问题,.net 4.0带来了TPL(Task Parallel Library)任务并行库,下 ...

随机推荐

  1. 001、Python数据结构

    #! usr/bin/env python # _*_ coding:utf-8 _*_ from random import randint ''' 一.list的增删改查 1.list.appen ...

  2. springboot源码解析-管中窥豹系列之BeanDefinition(八)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  3. SpringBoot整合shiro-MD5盐值加密

    为什么要进行密码加密? 在我们的日常生活中,许多人有着在不同网站上使用相同密码的坏习惯(包括我也是qaq),假如应用程序或服务器出现漏洞,数据被窃取,用户的明文密码直接被暴露给黑客.显然后果将不堪设想 ...

  4. Spring中AOP学习笔记

    AOP 描述(摘抄百度百科) AOP开发中的相关操作术语 实例(xml方式) 通知的类型 切入点表达式的写法: 实例(注解方式) 描述(摘抄百度百科) AOP(面向切面编程):Aspect Orien ...

  5. 电影推荐系统---协同过滤算法(SVD,NMF)

    SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述   1.1 项目安排     1.2 三大协同过滤   1.3 项目开发工具 ...

  6. spark mllib als 参数

    在一定范围内按照排列组合方式对rank,iterations,lambda进行交叉评估(根据均方根误差),找到最小误差的组合,用于建立矩阵分解模型.Signature: ALS.train( rati ...

  7. JSON简单理解

    JSON 与 JS 对象的关系 很多人搞不清楚 JSON 和 Js 对象的关系,甚至连谁是谁都不清楚.其实,可以这么理解: JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息 ...

  8. SwiftUI error All In One

    SwiftUI error All In One Instance member xxx cannot be used on type yyy Instance member 'game' canno ...

  9. Learning web development with MDN

    Learning web development with MDN Server-side website programming Dynamic Websites – Server-side pro ...

  10. NGK底层技术如何助力SPC子币VAST高价与安全并行?

    NGK近来使用了新的侧链技术推出了新的SPC侧链代币,以及SPC的子币VAST---维萨币. NGK使用去中心化和开源区块链数据分布式协议,不断打造高倍币,力求成为生态建设参与者们所信赖的高倍币孵化器 ...