执行每个新的System.Threading.Tasks.Task()创建一个新线程

本文关键字:创建 新线程 线程 一个 Tasks System Threading 执行 Task | 更新日期: 2023-09-27 18:19:10

我只是想弄清楚,因为我正在使用任务对象,以便在单独的通道中运行我的操作时间。但我想知道Task(()=>{...})是否与new Thread(new ThreadStart(()=>{....}))相似?

执行每个新的System.Threading.Tasks.Task()创建一个新线程

简短的回答:不。任务通过线程池执行。这里有一个关于此的博客:线程与任务:任务不创建自己的操作系统线程。相反,任务由TaskScheduler执行;默认调度器只在ThreadPool

上运行。

Task代表承诺在将来某个时间完成的工作。

关于如何创建Task有几个选项:

  1. 使用Task.RunTask.Factory.StartNew没有任何标志-这将排队工作在。net线程池,如前所述。

  2. 使用Task.Factory.StartNew并指定TaskCreationOptions.LongRunning -这将通知TaskScheduler使用新线程而不是ThreadPool线程。

  3. 当使用c# -5的async-await特性时,也称为Promise Tasks。当你在一个返回TaskTask<T>的方法上使用await时,它们可能不使用任何线程机制,无论是ThreadPool还是new Thread来完成它们的工作,因为它们可能使用纯异步API,这意味着它们将继续在执行它们的线程上执行,并且一旦命中第一个await关键字,将把控制返回给调用方法。

  4. Thanks to service for this one。另一个执行选项是创建自定义TaskScheduler并将其传递给Task.Factory.StartNew。自定义TaskScheduler将为您提供对Task

  5. 执行的细粒度控制。

所有这些选项都表明Task仅仅是一个承诺,并且有许多形式可以实现该承诺。线程是达到目的的手段,而Task是我们想要完成的工作单元。

有可能。这取决于.

  • 默认情况下,使用Task.RunTask.Factory.StartNewTask构造函数创建的Task对象将使用默认的TaskSchedluer,它将调度委托在线程池中运行。

  • 一个非默认的TaskScheduler可以用来调度任务在任何线程上运行,你使用该调度程序定义。你可以定义它在UI线程中运行,在它自己的新线程中运行,在。net线程池之外的线程池中运行,根本不运行,或者其他任何你想要的

  • 您可以使用TaskCompletionSource创建Task,其中根本不需要存在线程。Task甚至不需要表示委托的完成。它可以表示在将来某个时间完成的任何操作,可能有一个结果。可以包含在线程上运行的一些代码,也可以表示一个固有的异步操作,比如IO、用户行为、事件触发、各种其他任务的组合,或者任何你想要创建的东西。