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)

为指定的函数委托、取消标记、创建选项和任务计划程序创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<TResult>)

为指定的函数委托创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<Object,TResult>, Object)

为指定的函数委托和状态创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<TResult>, CancellationToken)

为指定的函数委托和取消标记创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<TResult>, TaskCreationOptions)

为指定的函数委托和创建选项创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken)

为指定的函数委托、状态和取消标记创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<Object,TResult>, Object, TaskCreationOptions)

为指定的函数委托、状态和创建选项创建并启动 TResult 类型的任务。

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)

为指定的函数委托、状态、取消标记、创建选项和任务计划程序创建并启动 TResult 类型的任务。

注解

从 .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 --> '򗄃' (0x55836 0x56579)
//       0x000A98A1 --> '򩢡' (0x55910 0x56481)
//       0x00050002 --> '񐀂' (0x55552 0x56322)
//       0x0000FEF1 --> 'ﻱ' (0x65265)
//       0x0008BC0A --> '򋰊' (0x55791 0x56330)
//       0x000860EA --> '򆃪' (0x55768 0x56554)
//       0x0009AC5A --> '򚱚' (0x55851 0x56410)
//       0x00053320 --> '񓌠' (0x55564 0x57120)
//       0x000874EF --> '򇓯' (0x55773 0x56559)

注解

调用 StartNew 在功能上等效于使用它的一个构造函数创建任务,然后调用 Task.Start 方法来计划任务的执行。

从 .NET Framework 4.5 开始,可以使用 Task.Run(Action) 方法作为使用默认参数进行调用的快速方法 StartNew(Action) 。 但请注意,这两个方法之间的行为有不同之处: Task.Run(Action) 默认情况下,不允许使用 TaskCreationOptions.AttachedToParent 附加到当前实例的选项启动子任务 Task ,而是 StartNew(Action) 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。

适用于

.NET 6 和其他版本

StartNew(Action<Object>, Object)

为指定的操作委托和状态创建并启动任务。

参数

action

Action<Object>

要异步执行的操作委托。

state

Object

一个包含由 action 委托使用的数据的对象。

返回

Task

已启动的任务。

例外

ArgumentNullException

action 参数为 null

示例

下面的示例定义了一个由6个字母构成的单词的数组。 然后,每个单词都将传递给一个 Action<T> 委托,该委托会打乱该词并显示原始单词及其已打乱的版本。

C#复制

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      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];
                                                      lock (lockObj) {
                                                         for (int ctr = 0; ctr < order.Length; ctr++)
                                                             order[ctr] = rnd.NextDouble();
                                                      }
                                                      Array.Sort(order, chars);
                                                      Console.WriteLine("{0} --> {1}", word,
                                                                        new String(chars));
                                                    }, word6));

      Task.WaitAll(tasks.ToArray());
   }
}
// The example displays output like the following:
//    regain --> irnaeg
//    ordain --> rioadn
//    reason --> soearn
//    rained --> rinade
//    rioter --> itrore
//    senior --> norise
//    rental --> atnerl
//    editor --> oteird

请注意,此示例初始化一个由锁保护的单个随机数生成器。 对于锁的需要,请参阅类主题中的 "系统随机类和线程安全" Random 。

注解

调用 StartNew 在功能上等效于 Task 使用它的一个构造函数创建,然后调用 Start 方法来计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅与 .NET 并行编程中的 StartNew Vs 任务 。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions, TaskScheduler)

为指定的函数委托、取消标记、创建选项和任务计划程序创建并启动 TResult 类型的任务。

C#复制

public System.Threading.Tasks.Task<TResult> StartNew<TResult> (Func<TResult> function, System.Threading.CancellationToken cancellationToken, System.Threading.Tasks.TaskCreationOptions creationOptions, System.Threading.Tasks.TaskScheduler scheduler);

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

cancellationToken

CancellationToken

将指派给新的任务的取消标记。

creationOptions

TaskCreationOptions

控制所创建的任务的行为的枚举值之一。

scheduler

TaskScheduler

用于计划所创建的任务的任务计划程序。

返回

Task<TResult>

已启动的任务。

例外

ObjectDisposedException

已释放提供的 CancellationToken

ArgumentNullException

function 为 null

或 scheduler 为 null

ArgumentOutOfRangeException

creationOptions 指定了一个无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<TResult>)

为指定的函数委托创建并启动 TResult 类型的任务。

C#复制

public System.Threading.Tasks.Task<TResult> StartNew<TResult> (Func<TResult> function);

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

返回

Task<TResult>

已启动的任务。

例外

ArgumentNullException

function 参数为 null

示例

下面的示例是一个简单的加法应用,它会生成两个随机数并提示用户输入其总和。 然后,它指示答案是否正确,或者如果用户的响应不是有效的数字,则会提示用户重新输入有效的数字。 StartNew用于创建 Task<TResult> 返回要添加的随机数的对象。

C#复制

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      Task<int>[] tasks = new Task<int>[2];
      Object obj = new Object();
      
      while (true) {
         for (int ctr = 0; ctr <= 1; ctr++)
            tasks[ctr] = Task.Factory.StartNew(() => { int i = 0;
                                                       lock(obj) {
                                                          i = rnd.Next(101);
                                                       }
                                                       return i; });

         Task.WaitAll(tasks);
         int n1 = tasks[0].Result;
         int n2 = tasks[1].Result;
         int result = n1 + n2;
         bool validInput = false;
         while (! validInput) {
            ShowMessage(n1, n2);
            string userInput = Console.ReadLine();
            // Process user input.
            if (userInput.Trim().ToUpper() == "X") return;
            int answer;
            validInput = Int32.TryParse(userInput, out answer);
            if (! validInput)
               Console.WriteLine("Invalid input. Try again, but enter only numbers. ");
            else if (answer == result)
               Console.WriteLine("Correct!");
            else
               Console.WriteLine("Incorrect. The correct answer is {0}.", result);
         }
      }
   }

   private static void ShowMessage(int n1, int n2)
   {
      Console.WriteLine("\nEnter 'x' to exit...");
      Console.Write("{0} + {1} = ", n1, n2);
   }
}
// The example displays the following output:
//       Enter 'x' to exit...
//       15 + 11 = 26
//       Correct!
//
//       Enter 'x' to exit...
//       75 + 33 = adc
//       Invalid input. Try again, but enter only numbers.
//
//       Enter 'x' to exit...
//       75 + 33 = 108
//       Correct!
//
//       Enter 'x' to exit...
//       67 + 55 = 133
//       Incorrect. The correct answer is 122.
//
//       Enter 'x' to exit...
//       92 + 51 = 133
//       Incorrect. The correct answer is 143.
//
//       Enter 'x' to exit...
//       81 + 65 = x

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以调用 Task.Run<TResult>(Func<TResult>) 方法,作为使用默认参数进行调用的快速方法 StartNew 。 但请注意,这两个方法之间的行为有不同之处: Task.Run<TResult>(Func<TResult>) 默认情况下,不允许使用 TaskCreationOptions.AttachedToParent 附加到当前实例的选项启动子任务 Task<TResult> ,而是 StartNew<TResult>(Func<TResult>) 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<Object,TResult>, Object)

为指定的函数委托和状态创建并启动 TResult 类型的任务。

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<Object,TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

state

Object

一个包含由 function 委托使用的数据的对象。

返回

Task<TResult>

已启动的任务。

例外

ArgumentNullException

function 为 null

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<TResult>, CancellationToken)

为指定的函数委托和取消标记创建并启动 TResult 类型的任务。

C#复制

public System.Threading.Tasks.Task<TResult> StartNew<TResult> (Func<TResult> function, System.Threading.CancellationToken cancellationToken);

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

cancellationToken

CancellationToken

将指派给新的任务的取消标记。

返回

Task<TResult>

已启动的任务。

例外

ObjectDisposedException

已释放提供的 CancellationToken

ArgumentNullException

function 为 null

示例

下面的示例使用两个任务来计算以 F100 = F100 + F100-2 (种子值为 F1 = 1,F2 = 1,F1 = 0,F2 = 1)结尾的斐波那契序列。 大约一半时间,将在操作执行时设置取消标记。 如果两个任务成功完成且标记已取消,则示例的输出将显示结果。

C#复制

using System;
using System.Collections.Generic;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      var rnd = new Random();
      var tasks = new List<Task<BigInteger[]>>();
      var source = new CancellationTokenSource();
      var token = source.Token;
      for (int ctr = 0; ctr <= 1; ctr++) {
         int start = ctr;
         tasks.Add(Task.Run( () => { BigInteger[] sequence = new BigInteger[100];
                                     sequence[0] = start;
                                     sequence[1] = 1;
                                     for (int index = 2; index <= sequence.GetUpperBound(0); index++) {
                                        token.ThrowIfCancellationRequested();
                                        sequence[index] = sequence[index - 1] + sequence[index - 2];
                                     }
                                     return sequence;
                                   }, token));
      }
      if (rnd.Next(0, 2) == 1)
         source.Cancel();
      try {
         Task.WaitAll(tasks.ToArray());
         foreach (var t in tasks)
            Console.WriteLine("{0}, {1}...{2:N0}", t.Result[0], t.Result[1],
                              t.Result[99]);
      }
      catch (AggregateException e) {
         foreach (var ex in e.InnerExceptions)
            Console.WriteLine("{0}: {1}", ex.GetType().Name, ex.Message);
      }
   }
}
// The example displays either the following output:
//    0, 1...218,922,995,834,555,169,026
//    1, 1...354,224,848,179,261,915,075
// or the following output:
//    TaskCanceledException: A task was canceled.
//    TaskCanceledException: A task was canceled.

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以使用 Task.Run<TResult>(Func<TResult>, CancellationToken) 方法作为使用默认参数进行调用的快速方法 StartNew<TResult>(Func<TResult>, CancellationToken) 。 但请注意,这两个方法之间的行为有不同之处: Task.Run<TResult>(Func<TResult>, CancellationToken) 默认情况下,不允许使用 TaskCreationOptions.AttachedToParent 附加到当前实例的选项启动子任务 Task<TResult> ,而是 StartNew<TResult>(Func<TResult>, CancellationToken) 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<TResult>, TaskCreationOptions)

为指定的函数委托和创建选项创建并启动 TResult 类型的任务。

C#复制

public System.Threading.Tasks.Task<TResult> StartNew<TResult> (Func<TResult> function, System.Threading.Tasks.TaskCreationOptions creationOptions);

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

creationOptions

TaskCreationOptions

控制所创建的任务的行为的枚举值之一。

返回

Task<TResult>

已启动的任务。

例外

ArgumentNullException

function 为 null

ArgumentOutOfRangeException

creationOptions 指定了一个无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken)

为指定的函数委托、状态和取消标记创建并启动 TResult 类型的任务。

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<Object,TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

state

Object

一个包含由 function 委托使用的数据的对象。

cancellationToken

CancellationToken

将指派给新的任务的取消标记。

返回

Task<TResult>

已启动的任务。

例外

ObjectDisposedException

已释放提供的 CancellationToken

ArgumentNullException

function 为 null

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<Object,TResult>, Object, TaskCreationOptions)

为指定的函数委托、状态和创建选项创建并启动 TResult 类型的任务。

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<Object,TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

state

Object

一个包含由 function 委托使用的数据的对象。

creationOptions

TaskCreationOptions

控制所创建的任务的行为的枚举值之一。

返回

Task<TResult>

已启动的任务。

例外

ArgumentNullException

function 为 null

ArgumentOutOfRangeException

creationOptions 指定了一个无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

适用于

.NET 6 和其他版本

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)

为指定的函数委托、状态、取消标记、创建选项和任务计划程序创建并启动 TResult 类型的任务。

类型参数

TResult

可通过任务获得的结果的类型。

参数

function

Func<Object,TResult>

一个函数委托,可返回能够通过任务获得的将来结果。

state

Object

一个包含由 function 委托使用的数据的对象。

cancellationToken

CancellationToken

将指派给新的任务的取消标记。

creationOptions

TaskCreationOptions

控制所创建的任务的行为的枚举值之一。

scheduler

TaskScheduler

用于计划所创建的任务的任务计划程序。

返回

Task<TResult>

已启动的任务。

例外

ObjectDisposedException

已释放提供的 CancellationToken

ArgumentNullException

function 为 null

或 scheduler 为 null

ArgumentOutOfRangeException

creationOptions 指定了一个无效的 TaskCreationOptions 值。 有关更多信息,请参见 FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions) 的备注

注解

调用 StartNew 在功能上等效于 Task<TResult> 使用它的一个构造函数创建,然后调用 Start 以计划执行。

从 .NET Framework 4.5 开始,可以将 Run 方法与对象结合使用, Action 作为使用默认参数调用的快速方法 StartNew 。 有关详细信息和代码示例,请参阅入门 任务。 在与 .Net 的并行编程中运行 StartNew。

另请参阅

适用于

.NET 6 和其他版本

表 17
产品版本
.NETCore 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6
.NET Framework4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP10.0
Xamarin.iOS10.8
Xamarin.Mac3.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值