调用异步方法和 Task.Run 异步方法之间的区别

2024-06-28

我的视图模型中有一个方法

private async void SyncData(SyncMessage syncMessage)
{
    if (syncMessage.State == SyncState.SyncContacts)
    {
        this.SyncContacts(); 
    }
}

private async Task SyncContacts()
{
    foreach(var contact in this.AllContacts)
    {
       // do synchronous data analysis
    }

    // ...

    // AddContacts is an async method
    CloudInstance.AddContacts(contactsToUpload);
}

当我打电话时SyncData来自 UI 命令并且我正在同步大量数据 UI 冻结。但当我打电话时SyncContacts用这种方法

private void SyncData(SyncMessage syncMessage)
{
    if (syncMessage.State == SyncState.SyncContacts)
    {
        Task.Run(() => this.SyncContacts()); 
    }
}

一切安好。它们不应该是一样的吗? 我认为不使用await 来调用异步方法会创建一个新线程。


它们不应该是一样的吗?我在想不使用await for 调用异步方法会创建一个新线程。

No, async不会神奇地为其方法调用分配一个新线程。async-await主要是利用自然异步 API,例如对数据库或远程 Web 服务的网络调用。

当你使用Task.Run,您显式地使用线程池线程来执行您的委托。如果您用async关键字,但不要await内部的任何事情都会同步执行。

我不确定你的是什么SyncContacts()方法实际上确实如此(因为您还没有提供它的实现),但是标记它async其本身不会给你带来任何好处。

Edit:

现在您已经添加了实现,我看到两件事:

  1. 我不确定同步数据分析的 CPU 密集程度如何,但这可能足以让 UI 变得无响应。
  2. 您没有等待异步操作。它需要看起来像这样:

    private async Task SyncDataAsync(SyncMessage syncMessage)
    {
        if (syncMessage.State == SyncState.SyncContacts)
        {
            await this.SyncContactsAsync(); 
        }
    }
    
    private Task SyncContactsAsync()
    {
        foreach(var contact in this.AllContacts)
        {
           // do synchronous data analysis
        }
    
        // ...
    
        // AddContacts is an async method
        return CloudInstance.AddContactsAsync(contactsToUpload);
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用异步方法和 Task.Run 异步方法之间的区别 的相关文章

随机推荐

  • 根据多列删除重复项

    我使用以下内容列出了重复项 select s MessageId t from Message s join select ToUserId FromUserId count as qty from Message group by ToU
  • 如果我们不生成窗口,为什么定时器不起作用?

    这是代码 import java awt event ActionEvent import java awt event ActionListener import javax swing JFrame import javax swing
  • 在 django admin 中将 json 文本显示为友好列表

    我有一个 JSONField http djangosnippets org snippets 1478 http djangosnippets org snippets 1478 在模型中 我试图找出向管理员用户显示数据而不是 json
  • 如何从 JobDSL 脚本中访问 Jenkins 作业参数列表?

    我想保存传递到 JobDSL 作业的参数 我知道我可以引用各个参数 但我想让代码通用 我如何访问传递给作业的参数列表 当前的代码看起来像这样 final jobParameters new File parameters jobParame
  • 部署到 Heroku 时找不到“site”模块

    我正在尝试将 django 应用程序部署到 Heroku 但我不断收到错误 ImportError no module named site 我正在使用来自的自定义构建包https github com jiaaro heroku buil
  • 如何针对 Mac OS X 10.5 进行编译

    我想编译 10 5 及更高版本的应用程序 自从我升级到 Snow Leopard 并安装了最新的 XCode 后 gcc 默认为 10 6 我试过了 isysroot Developer SDKs MacOSX10 5 sdk但这似乎不起作
  • 使用 htaccess 禁用目录浏览

    在我的服务器中我有一系列文件夹 我会拒绝对所有这些文件夹的访问 我能怎么做 我必须使用什么规则 在 htaccess 根目录中添加一行 deny from all 问题 如果您想保留自己的访问权限 allow from 192 168 1
  • PrimeFaces 3.0.M3 单元编辑器不更新值

    我读过了there https stackoverflow com questions 6365877 cell edit in primefaces is not updating the value 6487361 6487361 但我
  • div 宽度,单位:厘米(英寸)

    我需要在每个显示器中放入宽度为 25 厘米 10 英寸 的站点 div 我怎样才能做到呢 您可以简单地使用cmCSS 中的单位 mydiv width 25cm 请注意 正如其他人指出的那样 结果仍然取决于操作系统对显示器尺寸的正确读取 S
  • 剥掉所有的身体标签而不毁掉他们的孩子

    此 Ruby 代码使用Nokogiri http nokogiri org doc xpath tbody remove 删除 的子项 tbody 以及 tbody 他们自己 我只想删除所有 tbody 文档中的标签 将其子项留在原处 我怎
  • HTML输入日期,如何减少日期和图标之间的间距?

    我需要压缩输入类型日期 所以我尝试将宽度设置为 120px 问题是有一个space日期数字和输入日期图标之间 我需要减少或删除该空间 有没有办法做到这一点 我的代码 顺便说一句 我正在使用 bootstrap 4
  • 你可以在 Android 中有意打开多个文件吗?

    我正在尝试在 Android Studio 中编写一个应用程序来打开多个音乐文件并存储它们的路径 目前我所做的只是一次加载一个文件 这不会出现任何问题 例如 下面的代码显示了我的加载按钮的 onclicklister 和相关代码 本示例的一
  • Java字符串对象的创建

    我一直在阅读 Java String 对象 并且有这个问题 String x a String y b 它在Java中创建两个对象吗 这两行代码不会创建任何对象 字符串文字 例如 a 被放入字符串池 https stackoverflow
  • enableHiveSupport 在 java Spark 代码中引发错误[重复]

    这个问题在这里已经有答案了 我有一个非常简单的应用程序 尝试使用 Spark 从 src main resources 读取 orc 文件 我不断收到此错误 无法实例化具有 Hive 支持的 SparkSession 因为找不到 Hive
  • 通过绑定启用 TabItem

    我想在不同页面是 TabItem 的应用程序中使用 MVVM 为此 我使用视图模型 项目 的可观察集合并将其绑定到选项卡控件 ItemSource 对于每个视图模型 我创建了一个单独的数据模板来呈现正确的视图 如下所示
  • 如何用惰性传播实现线段树?

    我在互联网上搜索了有关线段树的实现的信息 但在惰性传播方面却一无所获 之前有一些关于堆栈溢出的问题 但它们专注于解决 SPOJ 的一些特定问题 虽然我认为这是用伪代码对线段树的最好解释 但我需要用惰性传播来实现它 我发现以下链接 除了上面的
  • 用于 GNU C++ 的 SSE SSE2 和 SSE3 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个简单的教程可以帮助我快速掌握 GNU C 中的 SSE SSE2 和 SSE3 如何在SSE中
  • 使用 Mathematica 在定义位置的左侧或右侧“StringCut”

    论读书这个问题 https stackoverflow com q 6052211 499167 我认为使用下面的问题会很简单StringSplit 给定以下字符串 我想将其 剪切 到每个 D 的左侧 以便 I get a List片段数
  • Google AppEngine Python 3.7 上的自定义库

    我正在尝试在 Google AppEngine Python 3 7 标准环境上部署一项服务 该环境需要一组库作为依赖项 无法部署依赖项之一 GDAL 2 2 2 并返回错误消息 File upload done Updating serv
  • 调用异步方法和 Task.Run 异步方法之间的区别

    我的视图模型中有一个方法 private async void SyncData SyncMessage syncMessage if syncMessage State SyncState SyncContacts this SyncCo