Task.Factory.StartNew 与 Task.Factory.FromAsync

2024-03-20

假设我们有一个 I/O 绑定方法(例如进行数据库调用的方法)。该方法可以同步和异步运行。那是,

  1. Sync:

    IOMethod()
    
  2. Async:

    BeginIOMethod()
    EndIOMethod()
    

那么当我们以如下所示的不同方式执行该方法时,在资源利用率方面有什么性能差异?

  1. var task = Task.Factory.StartNew(() => { IOMethod(); });
    task.Wait();
    
  2. var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
    task.Wait();
    

var task = Task.Factory.StartNew(() => { IOMethod(); });
task.Wait();

这将阻塞线程池线程IOMethod()正在执行,并且还阻塞当前线程,因为Wait()。阻塞线程总数:2。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
task.Wait();

这将(很可能)在不使用线程的情况下异步执行操作,但它会阻塞当前线程,因为Wait()。阻塞线程总数:1。


IOMethod();

这将阻塞当前线程IOMethod()正在执行。阻塞线程总数:1。

如果您需要阻止当前线程,或者如果阻止它对您来说没问题,那么您应该使用它,因为尝试使用 TPL 实际上不会给您任何东西。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
await task;

这将在不使用线程的情况下异步执行操作,并且还将等待操作异步完成,这要归功于await。阻塞线程总数:0。

如果您想利用异步并且可以使用 C# 5.0,则应该使用此方法。


var task = Task.Factory.FromAsync(BeginIOMethod, EndIOMethod, ... );
task.ContinueWith(() => /* rest of the method here */);

这将在不使用线程的情况下异步执行操作,并且还将等待操作异步完成,这要归功于ContinueWith()。阻塞线程总数:0。

如果您想利用异步性并且无法使用 C# 5.0,则应该使用此方法。

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

Task.Factory.StartNew 与 Task.Factory.FromAsync 的相关文章

随机推荐

  • Python“任务服务器”

    我的问题是 我应该使用哪个 python 框架来构建我的服务器 Notes 该服务器与其客户端进行 HTTP 对话 GET 和 POST 通过 pyAMF 客户端 提交 任务 进行处理 然后在一段时间后检索关联的 task result 提
  • 从封闭的模板类推导返回类型时,函数解析失败

    我一直在尝试为定点类型实现一个复数类 其中乘法运算的结果类型将是输入类型的函数 我需要有一些函数 可以将复数乘以复数 也可以将复数乘以实数 这本质上是代码的简化版本 其中 A 是我的复杂类型 template
  • Java:检测对于 JSON 不正确的控制字符

    我正在重新发明轮子并用 Java 创建我自己的 JSON 解析方法 我正在查看 非常好 文档json org http www json org 我唯一不确定的部分是它说的地方 或控制字符 由于文档非常清晰 并且 JSON 非常简单且易于实
  • Angular 模块与库

    太棒了 Angular 已经发布了版本 6 并且 CLI 提供了生成库的选项 他们称之为 备受期待的功能 现在 从商业角度来看 我想知道 为什么你实际上需要这个 为什么在现有项目中而不是可以像往常一样通过 npm 安装的单独项目 如果您希望
  • 如何通过设置类来格式化 jsTree 中的“li”和“a”DOM 元素?

    基本上 我有一个 jsTree 我需要格式化它li and a通过向每种类型添加自定义类来实现 DOM 元素 文档不清楚如何执行此操作 据我所知 无法添加自定义类 任何格式都必须通过覆盖 jquery 主题或编辑 jsTree 源代码来实现
  • 只能在草稿应用程序上创建状态为草稿的版本

    我正在使用 Jenkins AndroidAPKUpload 插件 我在 Play 商店中有一个应用程序的草稿版本 该应用程序仅用于内部测试 永远不会向公众发布 我认为这意味着它将永远是一个草案 当我尝试通过插件上传 APK 时 我收到错误
  • hibernate使用注释或使用hibernate配置文件

    我看过很多使用注释 基本上是hibernate注释或JPA注释 来实现hibernate的教程 有教程主要关注使用hibernate配置文件 hbm xml文件 根本没有使用注释 现在我有点困惑 哪种方法更好 我绝对更喜欢使用注释来定义我的
  • sinon 存根 withArgs 可以匹配部分参数但不是全部参数

    我有一个正在存根的函数 该函数会使用多个参数进行调用 我想检查一下只是第一个参数 其余的都是回调函数 所以我不想管它们 因此 我可能有以下 2 个调用 以 ajax 为例 method get sinon stub method get 2
  • Groovy HTTPBuilder:从 GZIPed 分块响应中获取实体内容

    我需要向 Web 服务器发送 POST 请求 并能够读取该服务器发送的响应 我尝试使用 HTTPBuilder lib 和以下代码 def http new HTTPBuilder http myServer http setProxy P
  • 更改 Laravel 5.2 中的登录/注册 URL

    我目前正在编写一个应用程序 该应用程序仅包含公司员工的帐户 而不包含常规网站访问者的帐户 因此 我想将与网站 管理 区域相关的 URL 保留在 admin URL 下 这意味着更改 login to admin login and regi
  • 获取一个 url 参数的数组

    我想获取 url param id 但它不起作用 这里每个人都可以帮助我吗 下面的代码不起作用 Url http localhost 9000 rest alerts ids 123 ids 456 路由配置文件 GET restws al
  • Excel-VBA:需要变量声明吗?

    如果写下面的代码会不会出错 Sub Something Dim i As integer Dim xRange As Range Dim yRange As Range Set xRange Range x table Set yRange
  • 控制 R 散点图中点的大小?

    在 R 中 plot 函数需要一个pch控制图中点的外观的参数 我正在制作具有数万个点的散点图 并且更喜欢一个小但不是太小的点 基本上 我发现pch 太小了 但是pch 19太胖了 中间有什么东西或者有什么方法可以以某种方式缩小这些点吗 A
  • 自定义 ASP.NET 身份

    我正在使用 Identity Server 4 并且已自定义 ASP NET Identity 用户 如下所示 public class ApplicationUser IdentityUser MaxLength 100 public v
  • Java 默认版本在 PATH 更改后不反映

    我当前正在 Java 1 7 0 17 64 位版本上运行 我想使用 Java 32 位版本启动一个应用程序 我更新了 PATH 变量以指向 C Program Files x86 Java jre7 bin Java 32 位版本 然后做
  • 如何在不设置内置错误的情况下触发 mat-date-range-input 的 mat-form-field 中 mat-error 的显示?

    根据问题 我有一个日期范围选择器start and end日期作为mat form field 我想执行自定义验证 例如 确保之间的绝对差异start and end不超过 15 天 并显示mat error在 的里面mat form fi
  • Groovy - 如何延迟 Groovlet 修改重新编译检查

    我是 Groovy 的新手 我正在考虑使用 Groovlets 不是 GRAILS 来替换一些 Servlet 如果我更改 Groovlet 的脚本文件 Groovlet 会重新编译并自动获取更改 包括从 Groovlet 引用的脚本 这对
  • 具有离散值的圆形 SeekBar

    我正在尝试创建一个具有离散非线性值的圆形搜索栏 我还希望这些值出现在圆圈之外 我从 GitHub 上查看了多个版本 其中最有希望的是JesusM https github com JesusM HoloCircleSeekBar但是 我想不
  • Emacs 是否可以运行位于远程服务器上的 Matlab shell?

    我希望能够使用 Matlab 模式 matlab el 来运行 matlab shell 唯一的问题是 Matlab 位于远程主机上 这可能吗 如果是这样 请解释一下 我现在正在和流浪汉玩 但没有成功 Thanks 我刚刚尝试通过 ssh
  • Task.Factory.StartNew 与 Task.Factory.FromAsync

    假设我们有一个 I O 绑定方法 例如进行数据库调用的方法 该方法可以同步和异步运行 那是 Sync IOMethod Async BeginIOMethod EndIOMethod 那么当我们以如下所示的不同方式执行该方法时 在资源利用率