执行每个新的System.Threading.Tasks.Task()创建一个新线程
本文关键字:创建 新线程 线程 一个 Tasks System Threading 执行 Task | 更新日期: 2023-09-27 18:19:10
我只是想弄清楚,因为我正在使用任务对象,以便在单独的通道中运行我的操作时间。但我想知道Task(()=>{...})
是否与new Thread(new ThreadStart(()=>{....}))
相似?
简短的回答:不。任务通过线程池执行。这里有一个关于此的博客:线程与任务:任务不创建自己的操作系统线程。相反,任务由TaskScheduler执行;默认调度器只在ThreadPool
Task
代表承诺在将来某个时间完成的工作。
关于如何创建Task
有几个选项:
使用
Task.Run
或Task.Factory.StartNew
没有任何标志-这将排队工作在。net线程池,如前所述。使用
Task.Factory.StartNew
并指定TaskCreationOptions.LongRunning
-这将通知TaskScheduler
使用新线程而不是ThreadPool线程。当使用c# -5的
async-await
特性时,也称为Promise Tasks
。当你在一个返回Task
或Task<T>
的方法上使用await
时,它们可能不使用任何线程机制,无论是ThreadPool还是new Thread
来完成它们的工作,因为它们可能使用纯异步API,这意味着它们将继续在执行它们的线程上执行,并且一旦命中第一个await
关键字,将把控制返回给调用方法。Thanks to service for this one。另一个执行选项是创建自定义
TaskScheduler
并将其传递给Task.Factory.StartNew
。自定义TaskScheduler
将为您提供对Task
执行的细粒度控制。
所有这些选项都表明Task
仅仅是一个承诺,并且有许多形式可以实现该承诺。线程是达到目的的手段,而Task
是我们想要完成的工作单元。
有可能。这取决于.
默认情况下,使用
Task.Run
、Task.Factory.StartNew
或Task
构造函数创建的Task
对象将使用默认的TaskSchedluer
,它将调度委托在线程池中运行。一个非默认的
TaskScheduler
可以用来调度任务在任何线程上运行,你使用该调度程序定义。你可以定义它在UI线程中运行,在它自己的新线程中运行,在。net线程池之外的线程池中运行,根本不运行,或者其他任何你想要的您可以使用
TaskCompletionSource
创建Task
,其中根本不需要存在线程。Task
甚至不需要表示委托的完成。它可以表示在将来某个时间完成的任何操作,可能有一个结果。可以包含在线程上运行的一些代码,也可以表示一个固有的异步操作,比如IO、用户行为、事件触发、各种其他任务的组合,或者任何你想要创建的东西。