C# TaskFactory.StartNew 方法
定义
命名空间:
System.Threading.Tasks
程序集:
mscorlib.dll, netstandard.dll
创建并启动 任务。
重载
StartNew(Action<Object>, Object, CancellationToken, TaskCreationOptions, TaskScheduler) |
为指定的操作委托、状态、取消令牌、创建选项和任务计划程序创建并启动任务。 |
StartNew(Action, CancellationToken, TaskCreationOptions, TaskScheduler) |
为指定的操作委托、取消令牌、创建选项和状态创建并启动任务。 |
StartNew(Action<Object>, Object, TaskCreationOptions) |
为指定的操作委托、状态和创建选项创建并启动任务。 |
StartNew(Action<Object>, Object, CancellationToken) |
为指定的动作委托、状态和取消标记创建并启动任务。 |
StartNew(Action, CancellationToken) |
为指定的动作委派和取消标记创建并启动任务。 |
StartNew(Action, TaskCreationOptions) |
为指定的操作委托和创建选项创建并启动任务。 |
StartNew(Action) |
为指定的操作委托创建并启动任务。 |
StartNew(Action<Object>, Object) |
为指定的操作委托和状态创建并启动任务。 |
StartNew<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions, TaskScheduler) |
为指定的函数委托、取消标记、创建选项和任务计划程序创建并启动 |
StartNew<TResult>(Func<TResult>) |
为指定的函数委托创建并启动 |
StartNew<TResult>(Func<Object,TResult>, Object) |
为指定的函数委托和状态创建并启动 |
StartNew<TResult>(Func<TResult>, CancellationToken) |
为指定的函数委托和取消标记创建并启动 |
StartNew<TResult>(Func<TResult>, TaskCreationOptions) |
为指定的函数委托和创建选项创建并启动 |
StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken) |
为指定的函数委托、状态和取消标记创建并启动 |
StartNew<TResult>(Func<Object,TResult>, Object, TaskCreationOptions) |
为指定的函数委托、状态和创建选项创建并启动 |
StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions, TaskScheduler) |
为指定的函数委托、状态、取消标记、创建选项和任务计划程序创建并启动 |
注解
从 .NET Framework 4.5 开始, Task.Run 方法是启动计算限制任务的建议方法。 StartNew仅当需要对长时间运行的、计算限制的任务进行精细控制时才使用此方法。 这包括要控制以下各项的方案:
任务创建选项。 默认情况下,由方法创建的任务 Task.Run 使用 TaskCreationOptions.DenyChildAttach 选项创建。 若要重写此行为或提供其他 TaskCreationOptions 选项,请调用 StartNew 重载。
参数通过。 方法的重载 Task.Run 不允许将参数传递给任务委托。 方法的重载 StartNew 执行。
任务计划程序。 方法的重载 Task.Run 使用默认的任务计划程序。 若要控制任务计划程序,请调用 StartNew 具有参数的重载
scheduler
。 有关详细信息,请参阅 TaskScheduler。
StartNew(Action<Object>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)
为指定的操作委托、状态、取消令牌、创建选项和任务计划程序创建并启动任务。
参数
action
Action<Object>
要异步执行的操作委托。
state
Object
一个包含由 action
委托使用的数据的对象。
cancellationToken
CancellationToken
将指派给新的任务的取消标记。
creationOptions
TaskCreationOptions
控制所创建的任务的行为的枚举值之一。
scheduler
TaskScheduler
用于计划所创建的任务的任务计划程序。
返回
Task
已启动的任务。
例外
ObjectDisposedException
已释放提供的 CancellationToken。
ArgumentNullException
action
为 null
。
或
scheduler
为 null
。
ArgumentOutOfRangeException
creationOptions
参数指定了一个无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注
注解
调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 以计划执行该任务。
从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action, CancellationToken, TaskCreationOptions, TaskScheduler)
为指定的操作委托、取消令牌、创建选项和状态创建并启动任务。
C#复制
public System.Threading.Tasks.Task StartNew (Action action, System.Threading.CancellationToken cancellationToken, System.Threading.Tasks.TaskCreationOptions creationOptions, System.Threading.Tasks.TaskScheduler scheduler);
参数
action
Action
要异步执行的操作委托。
cancellationToken
CancellationToken
将指派给新的任务的取消标记。
creationOptions
TaskCreationOptions
控制所创建的任务的行为的枚举值之一。
scheduler
TaskScheduler
用于计划所创建的任务的任务计划程序。
返回
Task
已启动的任务。
例外
ObjectDisposedException
已释放提供的 CancellationToken。
ArgumentNullException
action
为 null
。
或 scheduler
为 null
。
ArgumentOutOfRangeException
creationOptions
指定了无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注
注解
调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 以计划执行该任务。
从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action<Object>, Object, TaskCreationOptions)
为指定的操作委托、状态和创建选项创建并启动任务。
参数
action
Action<Object>
要异步执行的操作委托。
state
Object
一个包含由 action
委托使用的数据的对象。
creationOptions
TaskCreationOptions
控制所创建的任务的行为的枚举值之一。
返回
Task
已启动的任务。
例外
ArgumentNullException
action
为 null
。
ArgumentOutOfRangeException
creationOptions
指定了一个无效的 TaskCreationOptions 值。
注解
调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 以计划执行该任务。
从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action<Object>, Object, CancellationToken)
为指定的动作委托、状态和取消标记创建并启动任务。
参数
action
Action<Object>
要异步执行的操作委托。
state
Object
一个包含由 action
委托使用的数据的对象。
cancellationToken
CancellationToken
将指派给新的任务的取消标记。
返回
Task
已启动的任务。
例外
ObjectDisposedException
已释放提供的 CancellationToken。
ArgumentNullException
action
为 null
。
示例
下面的示例定义了一个由6个字母构成的单词的数组。 然后,每个单词都将传递给一个 Action<T> 委托,该委托会打乱该词并显示原始单词及其已打乱的版本。
C#复制
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;public class Example
{public static void Main(){CancellationTokenSource cts = new CancellationTokenSource();CancellationToken token = cts.Token;var tasks = new List<Task>();Random rnd = new Random();Object lockObj = new Object();String[] words6 = { "reason", "editor", "rioter", "rental","senior", "regain", "ordain", "rained" };foreach (var word6 in words6)tasks.Add(Task.Factory.StartNew( (word) => { Char[] chars = word.ToString().ToCharArray();double[] order = new double[chars.Length];token.ThrowIfCancellationRequested();bool wasZero = false;lock (lockObj) {for (int ctr = 0; ctr < order.Length; ctr++) {order[ctr] = rnd.NextDouble();if (order[ctr] == 0) {if (! wasZero) {wasZero = true;}else {cts.Cancel();}}}}token.ThrowIfCancellationRequested();Array.Sort(order, chars);Console.WriteLine("{0} --> {1}", word,new String(chars));}, word6, token));try {Task.WaitAll(tasks.ToArray());}catch (AggregateException e) {foreach (var ie in e.InnerExceptions) {if (ie is OperationCanceledException) {Console.WriteLine("The word scrambling operation has been cancelled.");break;}else {Console.WriteLine(ie.GetType().Name + ": " + ie.Message);}}}finally {cts.Dispose();}}
}
// The example displays output like the following:
// regain --> irnaeg
// ordain --> rioadn
// reason --> soearn
// rained --> rinade
// rioter --> itrore
// senior --> norise
// rental --> atnerl
// editor --> oteird
请注意,此示例初始化一个由锁保护的单个随机数生成器。 对于锁的需要,请参阅类主题中的 "系统随机类和线程安全" Random 。 若要处理随机数生成器损坏的可能性,请将取消标记传递给任务。 如果两个随机数等于零,则该方法假定随机数生成器已损坏并设置取消标记。 在对 chars
包含单词中的六个字符的数组进行排序之前,该方法会调用 CancellationToken.ThrowIfCancellationRequested 方法以 OperationCanceledException 在标记已取消的情况下引发。
注解
调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 以计划执行该任务。
从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action, CancellationToken)
为指定的动作委派和取消标记创建并启动任务。
C#复制
public System.Threading.Tasks.Task StartNew (Action action, System.Threading.CancellationToken cancellationToken);
参数
action
Action
要异步执行的操作委托。
cancellationToken
CancellationToken
将指派给新的任务的取消标记。
返回
Task
已启动的任务。
例外
ObjectDisposedException
已释放提供的 CancellationToken。
ArgumentNullException
action
为 null
。
示例
下面的示例调用 StartNew(Action, CancellationToken) 方法,以创建一个循环访问 C:\Windows\System32 目录中的文件的任务。 Lambda 表达式调用 Parallel.ForEach 方法,将有关每个文件的信息添加到 List<T> 对象。 循环调用的每个分离的嵌套任务会 Parallel.ForEach 检查取消标记的状态,如果请求取消,则调用 CancellationToken.ThrowIfCancellationRequested 方法。 CancellationToken.ThrowIfCancellationRequested OperationCanceledException catch
当调用线程调用方法时,方法将引发在块中处理的异常 Task.Wait 。
C#复制
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;public class Example
{public static void Main(){var tokenSource = new CancellationTokenSource();var token = tokenSource.Token;var files = new List<Tuple<string, string, long, DateTime>>();var t = Task.Factory.StartNew( () => { string dir = "C:\\Windows\\System32\\";object obj = new Object();if (Directory.Exists(dir)) {Parallel.ForEach(Directory.GetFiles(dir),f => {if (token.IsCancellationRequested)token.ThrowIfCancellationRequested();var fi = new FileInfo(f);lock(obj) {files.Add(Tuple.Create(fi.Name, fi.DirectoryName, fi.Length, fi.LastWriteTimeUtc)); }});}}, token);tokenSource.Cancel();try {t.Wait(); Console.WriteLine("Retrieved information for {0} files.", files.Count);}catch (AggregateException e) {Console.WriteLine("Exception messages:");foreach (var ie in e.InnerExceptions)Console.WriteLine(" {0}: {1}", ie.GetType().Name, ie.Message);Console.WriteLine("\nTask status: {0}", t.Status); }finally {tokenSource.Dispose();}}
}
// The example displays the following output:
// Exception messages:
// TaskCanceledException: A task was canceled.
//
// Task status: Canceled
注解
调用 StartNew
在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 来计划它的执行。
从 .NET Framework 4.5 开始,可以使用 Task.Run(Action, CancellationToken) 方法作为使用默认参数进行调用的快速方法 StartNew(Action, CancellationToken) 。 但请注意,这两个方法之间的行为有不同之处: Task.Run(Action, CancellationToken) 默认情况下,不允许使用 TaskCreationOptions.AttachedToParent 附加到当前实例的选项启动子任务 Task ,而是 StartNew(Action, CancellationToken) 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action, TaskCreationOptions)
为指定的操作委托和创建选项创建并启动任务。
C#复制
public System.Threading.Tasks.Task StartNew (Action action, System.Threading.Tasks.TaskCreationOptions creationOptions);
参数
action
Action
要异步执行的操作委托。
creationOptions
TaskCreationOptions
控制所创建任务的行为的枚举值之一>
返回
Task
已启动的任务。
例外
ArgumentNullException
action
为 null
。
ArgumentOutOfRangeException
creationOptions
指定了一个无效的 TaskCreationOptions 值。
注解
调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Start 以计划执行该任务。
从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。
适用于
.NET 6 和其他版本
StartNew(Action)
为指定的操作委托创建并启动任务。
C#复制
public System.Threading.Tasks.Task StartNew (Action action);
参数
action
Action
要异步执行的操作委托。
返回
Task
已启动的任务。
例外
ArgumentNullException
action
参数为 null
。
示例
下面的示例使用 StartNew(Action) 方法来重复调用一个 Action 委托,该委托生成一个随机数,将其解释为 Unicode 码位,并将其转换为 UTF16 编码的代码单元,并显示有关生成的一个或多个字符的信息。
C#复制
using System;
using System.Collections.Generic;
using System.Threading.Tasks;public class Example
{public static void Main(){Random rnd = new Random();List<Task> tasks = new List<Task>();// Execute the task 10 times.for (int ctr = 1; ctr <= 9; ctr++) {tasks.Add(Task.Factory.StartNew( () => {int utf32 = 0;lock(rnd) {// Get UTF32 value.utf32 = rnd.Next(0, 0xE01F0);}// Convert it to a UTF16-encoded character.string utf16 = Char.ConvertFromUtf32(utf32);// Display information about the character.Console.WriteLine("0x{0:X8} --> '{1,2}' ({2})", utf32, utf16, ShowHex(utf16));})); }Task.WaitAll(tasks.ToArray()); }private static string ShowHex(string value){string hexString = null;// Handle only non-control characters.if (! Char.IsControl(value, 0)) {foreach (var ch in value)hexString += String.Format("0x{0} ", Convert.ToUInt16(ch));} return hexString.Trim();}
}
// The example displays the following output:
// 0x00097103 --> '
C# TaskFactory.StartNew 方法相关推荐
- Task类的简单介绍
一.介绍 Task类通常以异步方式执行,Task对象是基于任务的异步模式引入到.NET Framework 4中. 二.任务实例化 using System; using System.Collect ...
- 一篇看懂C#中的Task任务_初级篇
文章目录 一.前言 二.认识 2.1. 基于任务的多线程编程 2.2. 隐式地创建并运行一个任务 2.3. 显示地创建并运行一个任务 2.3.1. Task常规使用 2.3.2. Task.Run() ...
- 第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案
一. 背景 揭秘: 在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面 ...
- Task.Run Vs Task.Factory.StartNew z
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task创建任务的几种方法
首先介绍一下Task,Task有什么用,说白了Task就是线程池ThreadPool的升级版,它弥补了ThreadPool的一些不足,比如说ThreadPool不支持线程的取消.完成.失败通知.执行的 ...
- .NET4.0并行计算技术基础(8)
说明: 要想看懂本系列文章,需要您对.NET多线程开发有基本的了解.我在新书<面向对象的艺术 --.NET Framework 4.0技术剖析与应用>(暂名)中花了近200页的篇幅来介绍. ...
- [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...
[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...
- C#之任务,线程和同步
1 概述 对于所有需要等待 的操作,例 如 ,因 为文件 . 数据库或网络访 问都需要一定 的时间,此 时就可以启 动一个新线程,同时完成其他任务,即使是处理密集型的任务,线程也是有帮助的. 2 Pa ...
- C#异步编程的实现方式(4)——Task任务
.Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操作.使用任务不仅可以获得一个抽象层,还能对底层线程进行很多统一的控制操作 ...
最新文章
- ios开发笔记之 APNS推送服务的实现
- vray渲染出图尺寸_Vray渲染出图该如何正确保存
- 在 NetBeans IDE 中设计 Swing GUI
- centos 下载oracle_Linux镜像下载大全
- C++多线程编程分析-线程间通信
- 转:漫画 我讨厌阅读别人的代码
- sparkR介绍及安装
- libspark.swfassist的体会
- 如果伦敦地铁图是数据科学家画的……
- yarn:info There appears to be trouble with your network connection. Retrying...
- Java查看class的JVM,指令集文件--javap -c ClassName
- 微信小程序审核不通过的解决方法
- Matlab函数——dct2
- qc中的流程图怎么画_QC流程图
- 湖南工大计算机学院大一分班,大一新生入学计算机分级教学考试会影响分班吗?...
- 数列极限导出重要无理数
- ElasticSearch head 安装
- Javascript笔记大全03
- GLCC编程夏令营——LMP课题 周会分享
- 收藏:学做美食--欢乐年夜饭之神七年糕火焰虾
热门文章