TPL 和 async/await 之间的区别(线程处理)

2023-12-13

尝试了解 TPL 和 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 线程。


我相信 TPL (TaskFactory.Startnew) 的工作方式与 ThreadPool.QueueUserWorkItem 类似,因为它在线程池中的线程上排队工作。

差不多.

从我读到的内容来看,异步/等待似乎只是“有时”创建一个新线程。

事实上,它永远不会。如果想要多线程,就得自己实现。有一个新的Task.Run方法只是简写Task.Factory.StartNew,这可能是在线程池上启动任务的最常见方法。

如果你正在处理 IO 完成端口,我可以看到它不必创建一个新线程,但否则我认为它必须创建。

答对了。所以像这样的方法Stream.ReadAsync实际上会创建一个TaskIOCP 的包装器(如果Stream有 IOCP)。

您还可以创建一些非 I/O、非 CPU“任务”。一个简单的例子是Task.Delay,它返回一段时间后完成的任务。

最酷的事情是async/await是你可以将一些工作排​​队到线程池中(例如,Task.Run),执行一些 I/O 密集型操作(例如,Stream.ReadAsync),并进行一些其他操作(例如,Task.Delay)...而且它们都是任务!它们可以等待或组合使用,例如Task.WhenAll.

任何返回的方法Task can be awaited - 它不一定是async方法。所以Task.Delay和 I/O 密集型操作只需使用TaskCompletionSource创建并完成任务 - 线程池上执行的唯一操作是事件发生时的实际任务完成(超时、I/O 完成等)。

我想我对 FromCurrentSynchronizationContext 的理解也总是有点模糊。我一直认为它本质上是 UI 线程。

I wrote 一篇文章 on SynchronizationContext。大多数时候,SynchronizationContext.Current:

  • 如果当前线程是 UI 线程,则为 UI 上下文。
  • 如果当前线程正在为 ASP.NET 请求提供服务,则为 ASP.NET 请求上下文。
  • 否则是线程池上下文。

任何线程can设置自己的SynchronizationContext,因此上述规则也有例外情况。

请注意,默认Task等待者将安排剩余的时间async方法对当前SynchronizationContext 如果它不为空;否则它会继续当前的状态TaskScheduler。这在今天并不那么重要,但在不久的将来它将成为一个重要的区别。

我自己写的async/await intro在我的博客上,Stephen Toub 最近发布了一篇出色的文章async/await FAQ.

关于“并发”与“多线程”,请参见这个相关的SO问题。我会说async启用并发,它可能是多线程的,也可能不是。很容易使用await Task.WhenAll or await Task.WhenAny进行并发处理,除非您明确使用线程池(例如,Task.Run or ConfigureAwait(false)),那么您可以同时进行多个并发操作(例如,多个 I/O 或其他类型,如Delay) - 并且它们不需要线程。对于这种情况,我使用术语“单线程并发”,尽管在 ASP.NET 主机中,您实际上可能会得到“zero-线程并发”。这非常贴心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TPL 和 async/await 之间的区别(线程处理) 的相关文章

  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • C# WinForms:使用一个或多个附加线程进行绘图。如何?

    如果我有一张包含各种几何形式 直线 矩形 圆形等 的大图 线程需要花费大量时间来绘制所有内容 但在现实生活中 一栋建筑是由不止一名工人建造的 因此 如果绘图是建筑物而线程是构建者 则绘制速度会快得多 但我想知道怎么做 你能告诉我怎么做吗 有
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 多线程Spring-boot控制器方法

    因此 我的应用程序 spring boot 运行速度非常慢 因为它使用 Selenium 来抓取数据 处理数据并显示在主页中 我遇到了多线程 我认为它对我的应用程序很有用 可以让它运行得更快 但是教程似乎显示在带有 main c 的普通 j
  • 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

    我实现了这样的单例模式 public sealed class MyClass public static MyClass Instance get return SingletonHolder instance static class
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • 是否可以在自定义 WCF 服务行为中创建 TransactionScope? (异步、等待、TransactionScopeAsyncFlowOption.Enabled)

    TL DR 解释问题的截屏视频 https youtu be B Q3T5KpiYk https youtu be B Q3T5KpiYk Problem 当交易从客户端流向服务时交易 当前变成null after awaiting服务到服
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 调用线程无法访问该对象,因为另一个线程拥有它

    我已经阅读了很多关于此错误的帖子 但我不明白如何在我的解决方案中解决它 我有一个进度条对话框 其中包含一些逻辑 通过按钮单击从 MainFrame 调用 void OnBtnClick object sender RoutedEventAr
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 使用/不使用 delegate() 启动线程

    有什么区别 new Thread new ThreadStart SomeFunc and new Thread delegate SomeFunc 这段代码在我的计算机上给出了奇怪的输出 public class A int Num pu
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s

随机推荐

  • 求 R 中函数的最大值

    我有以下功能 设 F 是累积分布函数gamma分布与shape 1 and rate 1 分母是生存函数S X 1 F X The g x 是平均剩余寿命函数 我在r中编写了以下函数 x 5 denominator 1 pgamma x 1
  • 定义一个新变量以进行大量迭代,给我一个错误

    我有一个端点 您可以获取有关产品的信息 URL API 产品 如果我通过该端点执行 GET 方法 我将获取每个产品的信息 但我也可以指定我想了解的产品 即 URL API products 9345TERFER 最后一个代码是产品的id 称
  • 仅显示 PHP 检索到的标题的第一个单词

    所以我试图显示我的另一个网站的列表 一切正常 但只存储 标题 属性的第一个单词 我知道整个标题是从其他网站检索的 所以我如何让它存储所有内容 如果有帮助的话 这是代码
  • JavaFX ListView 中的图像

    有没有办法将图像添加到 JavaFX ListView 中 这就是我当前设置列表视图项目的方式 private ListView
  • 1/0 是合法的 Java 表达式吗?

    以下内容在我的 Eclipse 中编译良好 final int j 1 0 compiles fine throws ArithmeticException by zero at run time Java 从一开始就阻止了许多 哑代码 的
  • 在 Microsoft Visual Studio 2013 的 WinForms 中启用 Entity Framework 6 for MySql (C#)

    昨天我知道实体框架是除了使用 Dataset 或 DataReader 之外访问数据库的另一种方法 然后我尝试使实体框架 6 适用于 MVS 2013 中的 MySql 数据库服务器 我使用 Net FrameWork 4 5 1 打开 W
  • 如何使用 Beautiful Soup 提取没有属性的

    标签?

    假设一个网页包含以下内容 p style display none p
  • ASP.NET 应用程序内存使用率较高

    我们的一些 ASP Net 应用程序存在问题 我们的一些应用程序从一开始就占用大量内存作为其工作集 在我们的 2 个 webfarm 服务器 每个 4GB RAM 上运行多个应用程序 我们有一个稳定的环境 大约有 1 2GB 的可用内存 然
  • 使用 CLGeocoder 的正向地理编码示例

    除了 Apple 文档之外 还有有关工作示例的说明或有关如何使用正向地理编码的一些指南 这很通用 我无法理解 拜托 这太好了 还有人知道他们是使用 Google API 来实现相同的还是他们自己的吗 发现这个有效 但如果其他人发现它有用 我
  • 从映射缓冲区写入“O_DIRECT”输出文件

    我有一个写入视频缓冲区的设备 该缓冲区是使用 CMA 在系统内存中分配的 我想实现从该缓冲区到块设备的流式写入 我的应用程序使用 mmap 打开视频缓冲区 我想使用O DIRECT写入以避免与页面缓存相关的开销 基本上 应用程序的伪代码如下
  • 在java中使用SAX解析大型XML

    我正在尝试解析堆栈溢出数据转储 其中一个表称为 posts xml 其中包含大约 1000 万个条目 示例 XML
  • 使用多个对象作为键的哈希/关联数组

    有没有一种方法可以创建一个关联数组 其中每个键都是多个对象的哈希值 我对检查每个对象的状态不感兴趣 而是对对象的身份感兴趣 var myarray var a new A var b new B var c new C is not rig
  • 如何解决 CSS 文件中的“序言中不允许字符”错误

    我有财产声明h3 color 333 在我的 CSS 文件中 当我检查我的 CSS 文件时https validator w3 org 表明 序言中不允许出现字符 h 我的 h3 标签有什么问题 序言 是什么意思 有人可以解释一下吗 htt
  • 从 db2 导出带有列名的数据

    我想将 db2 表中的数据导出为 csv 格式 我还需要第一行应该是所有列名称 我使用以下命令几乎没有成功 EXPORT TO TEST csv OF DEL MODIFIED BY NOCHARDEL coldel SELECT col1
  • 值中带有数组的 NUnit 顺序属性

    我怎样才能通过string 数组到 ValuesAttribute I have public string Array1 new new test1 test2 Test Sequential public void SomeTest V
  • 用于 Avaya IVR 和 CTI 集成的 Java 客户端

    我正在寻求开发一个 Java 客户端 用于将 Avaya IVR 集成到 CTI 我有两个问题 IVR输出的格式是什么 如何使用JAVA读取此内容 我想开发一个java程序 它能够读取呼叫者提供给IVR的输入 并据此采取一些行动 Avaya
  • 确定 C++0x 可用性

    我试图确定编译时 C 0x 功能是否可用 有通用的预处理器宏吗 我使用的是 Visual Studio 2010 的编译器和 Intel 的编译器 宏观 cplusplus will 有一个价值比 更棒199711L 也就是说 并非所有编译
  • 赋值运算符与自定义构造函数的关系

    include
  • CursorAdapter如何在android上的GridView中工作

    我在 gridview 上使用光标适配器时遇到问题 我使用光标从媒体商店加载照片 我意识到我的 newView 和 bindView 被完全调用了 我的意思是假设我有 500 张照片 newView 也会被调用相同的次数 我做错了什么吗 我
  • TPL 和 async/await 之间的区别(线程处理)

    尝试了解 TPL 和 TPL 之间的区别async await当谈到线程创建时 我相信 TPL TaskFactory StartNew 的工作原理类似于ThreadPool QueueUserWorkItem因为它在线程池中的线程上排队工