- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试了解 TPL 和 async
/await
在线程创建方面的区别。
我相信 TPL (TaskFactory.StartNew
) 的工作方式与 ThreadPool.QueueUserWorkItem
类似,因为它对线程池中的线程上的工作进行排队。当然,除非您使用创建新线程的 TaskCreationOptions.LongRunning
。
我认为async
/await
本质上会以类似的方式工作:
TPL:
Factory.StartNew( () => DoSomeAsyncWork() )
.ContinueWith(
(antecedent) => {
DoSomeWorkAfter();
},TaskScheduler.FromCurrentSynchronizationContext());
异步
/等待
:
await DoSomeAsyncWork();
DoSomeWorkAfter();
将是相同的。从我读到的内容看来,async
/await
仅“有时”创建一个新线程。那么什么时候创建新线程,什么时候不创建新线程呢?如果您正在处理 IO 完成端口,我可以看到它不必创建新线程,但否则我认为它必须创建。我想我对 FromCurrentSynchronizationContext 的理解也总是有点模糊。我一直认为它本质上是 UI 线程。
最佳答案
I believe the TPL (TaskFactory.Startnew) works similar to ThreadPool.QueueUserWorkItem in that it queues up work on a thread in the thread pool.
From what i've been reading it seems like async/await only "sometimes" creates a new thread.
事实上,从来没有。如果想要多线程,就得自己实现。有一个新的 Task.Run
方法,它只是 Task.Factory.StartNew
的简写,它可能是在线程池上启动任务的最常见方法。
If you were dealing with IO completion ports i can see it not having to create a new thread but otherwise i would think it would have to.
宾果游戏。因此,像 Stream.ReadAsync 这样的方法实际上会围绕 IOCP 创建一个 Task
包装器(如果 Stream
有 IOCP)。
您还可以创建一些非 I/O、非 CPU“任务”。一个简单的例子是 Task.Delay
,它返回一个在一段时间后完成的任务。
关于async
/await
的一个很酷的事情是,您可以将一些工作排队到线程池中(例如,Task.Run
),执行一些 I/O 绑定(bind)操作(例如,Stream.ReadAsync
),并执行一些其他操作(例如,Task.Delay
)...任务!它们可以等待或组合使用,例如 Task.WhenAll
。
任何返回 Task
的方法都可以进行 await
处理 - 它不必是 async
方法。因此,Task.Delay
和 I/O 绑定(bind)操作只需使用 TaskCompletionSource
来创建和完成任务 - 线程池上执行的唯一操作是实际任务完成时事件发生(超时、I/O 完成等)。
I guess my understanding of FromCurrentSynchronizationContext always was a bit fuzzy also. I always throught it was, in essence, the UI thread.
我写了an article在 SynchronizationContext
上。大多数时候,SynchronizationContext.Current
:
任何线程都可以设置自己的SynchronizationContext
,因此上述规则也有异常(exception)。
请注意,默认的 Task
等待程序将在当前 SynchronizationContext
上调度 async
方法的剩余部分(如果它不为 null) ;否则它将继续执行当前的TaskScheduler。这在今天并不那么重要,但在不久的将来它将成为一个重要的区别。
我自己写的async
/await
intro在我的博客上,Stephen Toub 最近发布了一篇出色的文章 async
/await
FAQ .
关于“并发”与“多线程”,请参阅this related SO question 。我想说,async
支持并发,它可能是多线程的,也可能不是。使用 await Task.WhenAll
或 await Task.WhenAny
进行并发处理很容易,除非您显式使用线程池(例如 Task.Run
或 ConfigureAwait(false)
),那么您可以同时进行多个并发操作(例如,多个 I/O 或其他类型,如 Delay
) - 他们不需要线程。对于这种情况,我使用术语“单线程并发”,但在 ASP.NET 主机中,您实际上可能会得到“零线程并发”。这很甜蜜。
关于multithreading - TPL 和 async/await 之间的区别(线程处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285159/
我有2个功能: function func1() while true do -- listen on connection end end function func2()
我的问题可能看起来很奇怪,但我想我正面临着 volatile 的问题。对象。 我写了一个这样实现的库(只是一个方案,不是真正的内容): (def var1 (volatile! nil)) (def
由于 maven 支持多线程构建,是否可以同时运行 Sonar 多线程? (例如 mvn sonar:sonar -T 4 ) 我运行了它,当模块报告成功时,它报告整个构建失败并返回 java.uti
我们正在启动一个网站,该网站在短时间内的交易量非常大。它基本上是在给票。该代码是用Java,Spring和Hibernate编写的。我想通过产生多个线程并尝试使用JUnit测试用例来获取票证来模仿高容
我正在尝试访问像素数据并将图像从游戏中的相机保存到磁盘。最初,简单的方法是使用渲染目标,然后使用RenderTarget-> ReadPixels(),但是由于ReadPixels()的 native
我们有以下系统: 用户数:〜500k 项目数:〜100k UserSimilarity userSimilarity = new TanimotoCoefficientSimilarity(dataM
也许这是一个经常出现的问题,但我需要根据我的上下文进行一些自定义。 我正在使用 Spring Batch 3.0.1.RELEASE 我有一个简单的工作,有一些步骤。一个步骤是这样的 block :
也许这是一个经常出现的问题,但我需要根据我的上下文进行一些自定义。 我正在使用 Spring Batch 3.0.1.RELEASE 我有一个简单的工作,有一些步骤。一个步骤是这样的 block :
我正在尝试使用PyBrain和Python的multiprocessing软件包在Python中训练神经网络。 这是我的代码(它训练了一个简单的神经网络来学习XOR逻辑)。 import pybrai
我有一个繁重的功能,不适合在主时间轴上执行(因为要花很长时间才能完成并使程序崩溃)。 因此我在air(as3)中搜索多线程,但是我发现的所有示例都说明了如何在worker中运行单独的swf文件。如何在
我想实现线程A 和线程B 并行运行并共享全局变量。 下面是用python编写的代码。我想在中执行相同操作Dart (我不想使用future等待,因为它正在等待其他线程完成或必须等待。) 大小写变量:
我的一个项目只适用于调试 DLL,而不适用于非调试 DLL。 在 Debug DLL 设置下发布项目有哪些注意事项?例如,是否丢失了某些优化? 如何通过将调试版本设置为非调试 DLL 来调试此项目?我
我正在尝试比较 Matlab 和 Julia 之间的速度和性能。我正在查看一个代码,该代码对承受给定负载的连续体结构进行拓扑优化。我正在查看的代码是公共(public)代码topopt88.m:htt
Serving Flask 应用程序“服务器”(延迟加载) 环境:生产警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产 WSGI 服务器。 Debug模式:开启 在 http://0.0.
我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此链接进行 self 更新的基本进度条:Python pyqt pulsing
我正在尝试指定在特定线程上运行任务,这样我就可以使用两个专用于“放入” channel 的耗时任务的线程,而其他线程则用于处理该任务。 我对如何将特定任务分配给特定线程感到困惑。我以为我可以使用类似
我正在编写一个软件,它对很多(潜在的大)图像进行大量图像操作/合成。 多线程有助于提高速度,但 QT 不允许同时在同一图像上使用多个 QPainter。 所以我必须在副本的每个线程中进行图像操作/合成
此脚本读取 url 文件以执行多线程 HTTP 请求。 如何使用带有 url 的数组来发出多线程请求? 我的阵列将有类似的东西: @array = ("https://example.com/xsd"
Java 文档声明了以下关于构造函数同步的内容: Note that constructors cannot be synchronized — using the synchronized keyw
我有一个程序,其中主线程创建了很多线程。它崩溃了,我正在调试核心文件。崩溃发生在其中一个子线程中。为了找到原因,我需要知道主线程是否还活着。有什么方法可以找出哪个线程是初始线程? 最佳答案 Is th
我是一名优秀的程序员,十分优秀!