【发布时间】:2012-05-04 08:05:19
【问题描述】:
在线程创建方面尝试了解 TPL 和 async/await 之间的区别。
我相信 TPL (TaskFactory.StartNew) 的工作方式类似于 ThreadPool.QueueUserWorkItem,因为它在线程池中的线程上排队工作。当然,除非您使用 TaskCreationOptions.LongRunning 创建一个新线程。
我认为async/await 的工作原理与此类似:
TPL:
Factory.StartNew( () => DoSomeAsyncWork() )
.ContinueWith(
(antecedent) => {
DoSomeWorkAfter();
},TaskScheduler.FromCurrentSynchronizationContext());
Async/Await:
await DoSomeAsyncWork();
DoSomeWorkAfter();
将是相同的。从我一直在阅读的内容来看,async/await 似乎只有“有时”会创建一个新线程。那么它什么时候创建一个新线程,什么时候不创建一个新线程呢?如果您正在处理 IO 完成端口,我可以看到它不必创建新线程,否则我认为它必须这样做。我想我对FromCurrentSynchronizationContext 的理解也总是有点模糊。我一直认为它本质上是 UI 线程。
【问题讨论】:
-
实际上,TaskCreationOptions.LongRunning 并不能保证“新线程”。根据 MSDN,“LongRunning”选项仅向调度程序提供提示;它不保证有一个专用线程。我发现了这个困难的方式。
-
@eduncan911 尽管您对文档的看法是正确的,但我不久前查阅了 TPL 源代码,我很确定实际上在
TaskCreationOptions.LongRunning时总是会创建一个新的专用线程已指定。 -
@ZaidMasud:你可能想再看看。我知道它正在合并线程,因为
Thread.CurrentThread.IsThreadPoolThread对于几百毫秒的短时间运行线程返回 true。更不用说我使用的 ThreadStatic 变量渗入多个线程,导致各种破坏。我不得不强制我的代码新建多个 Thread(),这是老式的方式,以保证专用线程。换句话说,我不能将 TaskFactory 用于专用线程。或者,您可以实现自己的TaskScheduler,它始终返回一个专用线程。
标签: multithreading task-parallel-library async-await c#-5.0