Task.FromResult() 与 Task.Run()

2024-04-10

我最近遇到过不少情况async方法同步执行,但无论如何都会返回一个任务,因此可以等待它们,例如

public virtual Task CreateAsync(TUser user)
{
    ThrowIfDisposed();
    if (user == null) throw new ArgumentNullException("user");
    Context.Save(user);
    Context.Flush();
    return Task.FromResult(0);
}

当然,最好将可能长时间运行的操作分派给线程并返回仍然活动的任务,以真正等待:

public virtual Task CreateAsync(TUser user)
{
    ThrowIfDisposed();
    if (user == null) throw new ArgumentNullException("user");
    return Task.Run(() =>
    {
        Context.Save(user);
        Context.Flush();
    });
}

不过,我有些怀疑,仅仅剥离 TPL 线程并不是最安全的做法。对这两种不同模式有什么评论吗?


如果你的方法是同步的,你不应该返回Task首先。只需创建一个传统的同步方法即可。

如果由于某种原因这是不可能的(例如,您实现了一些异步接口),则使用返回已完成的任务Task.FromResult在这种情况下甚至更好Task.CompletedTask(在.NET 4.6中添加)比使用要好得多Task.Run在实施中:

public virtual Task CreateAsync(TUser user)
{
    // ...
    return Task.CompletedTask;
}

如果您的 API 的使用者非常关心Task-返回方法不同步运行,他们可以使用Task.Run自己去确定。

您应该记住,异步方法可能有相当多的同步部分(第一个等待之前的部分),即使它们最终确实以异步方式继续。您不能假设异步方法返回Task无论如何,立即。

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

Task.FromResult() 与 Task.Run() 的相关文章

随机推荐

  • 从 Console.ReadLine 输入检索数据类型

    我对编程还很陌生 我遇到了挑战 但我需要你的帮助 我的任务是编写一个程序 从控制台读取一些内容 然后如果它的数字它会打印 1 如果它的字符串它看起来像这样 string 这是我的代码 但有问题 我无法弄清楚 必须使用 Switch Case
  • DBD::Oracle 安装导致错误

    我想通过 Perl 连接到 Oracle 数据库 为此 我尝试使用以下命令从 CPAN 安装 DBD Oracle root localhost Admin cpan DBD Oracle 在我的 Linux 终端上运行上述命令时 出现以下
  • 授予 bjyauthorize 从 CLI 运行 ZF2 mvc 应用程序的权限

    我在 ZF2 上有一个完全运行的 mvc 应用程序 我想从命令行运行一些操作 我已经正确设置了控制台路由和其他环境 当我从 CLI 运行我的应用程序时 出现权限被拒绝的异常 如下所示 You are not authorized to ac
  • 从源代码编译 Ruby 1.8.7 时出错:math.c:37: 错误:标记“(”之前缺少二元运算符

    这真的很奇怪 josh josh wget ftp ftp ruby lang org pub ruby 1 8 ruby 1 8 7 tar bz2 josh josh tar xvjf ruby 1 8 7 tar bz2 josh j
  • Xcode Autolayout - 约束等于另一个约束

    我终于尝试在 IB 中采用自动布局 但在为某些对象设置约束时遇到问题 我基本上希望 5 个视图在整个超级视图中垂直均匀分布 我有 3 个按钮 由 2 行分隔 我希望间距 D1 D2 D3 和 D4 相等WITHOUT调整任何东西的高度 在I
  • Laravel 4 + AJAX 不工作

    我对 Laravel 4 很陌生 我正在尝试测试 AJAX 请求 In my script js我有这个 function login submit click function e e preventDefault return ajax
  • Ruby 模型的数组属性

    是否可以为数组类创建一个属性 我尝试阅读this https stackoverflow com questions 3438827 ruby model with an array as an attribute但我并没有从中得到太多 我
  • 无法在真实设备上的 iOS 10 上运行 Appium 测试

    自从将我的设备和 xCode 更新到 iOS 10 和 Xcode 8 以来 我一直无法在真实设备上成功设置 Appium 测试 不过 我在模拟器上运行得很好 以下是我的功能设置 DesiredCapabilities cap new De
  • Rails 表单动态添加字段

    我正在尝试设置一组字段以根据需要动态显示 在模型中 我有以下字段 attr accessible instruct1 instruct2 instruct30 我希望表单只显示 instruct1 并带有一个按钮来添加 1 个字段 直到击中
  • 在 Apex 类中引用远程站点设置 URL?

    我有一个 webservice 类 它将位于托管包中并分发给多个客户端 该类当前有一个变量 其中包含它所访问的服务器的硬编码值 问题 每个客户端的服务器都不同 因此硬编码值不起作用 我认为由于每个客户端都必须将其服务器添加到其远程站点设置中
  • 如何比较 MySQL 数据库模式 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一个可以让我比较 MySQL 数据库模式的工具 哪个是最好的工具来做到这一点 Navicat 能够为您做到这一点 它还将同步两个 mysql
  • AES加密/解密

    以下是一些适用于字符串的代码 Public Function AESEncrypt ByVal PlainText As String ByVal Password As String ByVal salt As String Dim Ha
  • 如何在“git Push”之后在本地和远程撤消“git commit”

    我已经表演过git commit随后是一个git push 如何在本地和远程存储库上恢复该更改 git log commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8 Author Michael
  • 开源 Twitter 克隆(在 Ruby/Python 中)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何用 Ruby 或 Python 编写的生产就绪的开源 Twitter 克隆 我对功能丰富的实现
  • 如何备份 Django 数据库

    我有一个使用 Postgres 数据库的 Django 应用程序 我需要能够备份和恢复数据库 既确保没有数据丢失 又能够在测试期间将数据从生产服务器复制到开发服务器 似乎有几种不同的方法可以做到这一点 只需直接与数据库交互即可 因此 对于
  • CKEditor 如何在取消帖子时删除服务器中的图像文件

    我正在使用nodeJS 后端 react 前端 mongoDB 我安装了 CKEditor5 以便在船上发布许多图像 它可以完美地在我的服务器文件夹上上传图像CKfinder But 如果有人停止发布上传的图像 无用的图像将保留在我的服务器
  • 警告:远程 HEAD 引用不存在的引用,无法结帐

    由于不同原因 这似乎是一个常见的错误 我有一个简单的裸 git 存储库 名为 kiflea git 我像这样克隆它 git clone git kipdola be kiflea git 然后 git 告诉我 warning remote
  • Mockito 3 any() 严格存根参数不匹配

    我正在使用 Mockito 3 1 0 我正在尝试用以下语法模拟我的方法 when mockedObject myMethod any HttpServletRequest class thenReturn 1 myMethod很简单 pu
  • 如何在 Strawberry Perl 中更改@INC?

    我该如何改变 INC永久地 而不改变我的脚本 在 Strawberry Perl 中 我知道 I 但不想每次都调用该开关 要添加路径 请将环境变量 PERL5LIB 设置为这些路径 注意 这将影响您运行的所有 Perl 安装 操作方法 右键
  • Task.FromResult() 与 Task.Run()

    我最近遇到过不少情况async方法同步执行 但无论如何都会返回一个任务 因此可以等待它们 例如 public virtual Task CreateAsync TUser user ThrowIfDisposed if user null