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. Python_小程序

    一.开发前的准备工作 1.申请AppID:一个账号对应一个小程序,个人/个体只能申请5个小程序 2.下载开发工具 二.小程序的文件结构 三. 1.数据绑定 1.1数据的设置 Page( data:{ ...

  2. docker的网络-单主机(三种原生网络)none、host、bridge

    docker的网络分为:单主机.跨主机 这篇先说:单主机 我们先说一下docker的原生网络模式 网络模式 简介 优点 使用场景 none 空网络,没有网络 此网络与外界隔离,安全度非常高 适合公司内 ...

  3. python文件持久化存储

    文件持久化存储 目录 文件持久化存储 脑图 文件的操作 with 语句 OS模块 json模块 存储为Excel文件 脑图 文件的操作 import os import platform # 1. 获 ...

  4. Deep Learning Specialization 笔记

    1. numpy中的几种矩阵相乘: # x1: axn, x2:nxb np.dot(x1, x2): axn * nxb np.outer(x1, x2): nx1*1xn # 实质为: np.ra ...

  5. 口罩 & 防毒面具 N95 & P100

    口罩 & 防毒面具 N95 & P100 N95 口罩 < 防毒面具 P100 https://www.techritual.com/2020/01/30/210599/

  6. SSO & Single Sign On

    SSO & Single Sign On 单点登录 https://en.wikipedia.org/wiki/Single_sign-on https://cloud.google.com/ ...

  7. Dart: path库

    path库pub地址 安装: dependencies: path: 使用: import 'dart:io'; import 'package:path/path.dart' as path; ma ...

  8. 5分钟入门websocket

    5 个步骤快速掌握消息发送和接收 获取您的 appkey 先注册一个irealtime账号,然后登录到后台管理端,创建一个免费应用,就能得到您的 appkey.点击注册 各种前端生态端集成 ireal ...

  9. css故障文字动画

    免费分享95套java实战项目,不仅有源码还有对应的开发视频,关注公众号『勾玉技术』回复"95"即可获取 首先给内容上hover和before, .glitch:hover:bef ...

  10. JS数组的常用属性或方法

    1.length 数组长度 计算数组的长度 var arr=[1,2,3,4,5]; console.log(arr.length);//输出结果是5 2. push() 添加元素 向数组尾部添加新元 ...