我刚尝试使用Task
对象,使我的时间操作在单独的通道中运行。但我想知道Task(()=>{...})
是否类似于创建new Thread(new ThreadStart(()=>{....}))
?
我刚尝试使用Task
对象,使我的时间操作在单独的通道中运行。但我想知道Task(()=>{...})
是否类似于创建new Thread(new ThreadStart(()=>{....}))
?
简短回答:不是。任务是通过线程池执行的。这里有一篇关于此的博客:Threads vs. Tasks:任务不会创建自己的操作系统线程。而是由TaskScheduler执行任务;默认调度程序仅在ThreadPool上运行。
Task
表示在未来某个时间完成工作的承诺。Task
的选项:
使用没有任何标志的 Task.Run
或 Task.Factory.StartNew
- 这将在 .NET 线程池上排队工作。
使用 Task.Factory.StartNew
并指定 TaskCreationOptions.LongRunning
- 这将通知 TaskScheduler
使用新线程而不是 ThreadPool 线程。
使用 C#-5 的 async-await
特性,也称为 Promise Tasks
。当您 await
返回 Task
或 Task<T>
的方法时,它们可能不使用任何线程机制,无论是 ThreadPool 还是 new Thread
来执行其工作,因为它们可能使用纯异步 API,这意味着它们将继续在执行它们的线程上执行,并且一旦遇到第一个 await
关键字,就会将控制权返回给调用方法。
感谢 Servy 提供的信息。另一种执行选项是创建自定义 TaskScheduler
并将其传递给 Task.Factory.StartNew
。自定义 TaskScheduler
将为您提供对任务执行的精细控制。
Task
只是一个承诺,而有许多形式可以实现该承诺。线程只是达到目的的手段,而 Task
则是我们想要完成的工作单位。await
来创建的。任何在await
之后运行的代码都是在某个实际线程上运行的。await
只是一个工具,让您在任务完成时运行一些代码;被等待的任务可能涉及实际线程的使用,也可能不涉及。此外,在使用Run
时,除了1和2之外,还有其他选项可供选择。 - Servy