异步方法在第一个“等待”之前可以有昂贵的代码吗?

2023-11-25

在第一个异步方法之前,在异步方法的开始处使用昂贵的代码是否不好?await叫做?这段代码是否应该用TaskEx.Run反而?

public async Task Foo()
{
    // Do some initial expensive stuff.
    // ...

    // First call to an async method with await.
    await DoSomethingAsync;
}

正如里德所说,这实际上取决于上下文。该代码必须运行在some点 - 但根据上下文,它最终可能会在线程池线程而不是某个关键线程上运行。

而不是使用Task.Run,我会用TaskEx.Yield:

public async Task Foo()
{
    await TaskEx.Yield();
    // Do expensive stuff
}

据我所知,这基本上是一种立即返回调用者的方法,但允许立即安排异步方法的其余部分。如果您处于 Windows 窗体 UI 线程之类的环境中,那么这样做是没有意义的,因为您将立即返回到 UI 线程(并在那里运行昂贵的代码) - 但如果您处于上下文中,则这是有意义的当前线程不应被阻塞,但延续在另一个线程上运行。

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

异步方法在第一个“等待”之前可以有昂贵的代码吗? 的相关文章

随机推荐

  • 如何在不重新组合的情况下获得精确的尺寸?

    我需要可组合项的大小来绘制动态线条 但我不想通过以下方式获取大小 var size by remember mutableStateOf IntSize Zero Modifier onSizeChanged size it or Modi
  • Android锁屏API?

    我见过两个可以自定义锁屏的应用程序 Widget locker slidescreen 我们真的有一个 API 可以让我们自定义锁屏吗 如果不是的话 有什么技巧呢 请参阅 mylockforandroid 安卓版的我的锁 它是 GPL 的
  • 将文件分块发送到 HttpHandler

    我正在尝试将文件分块发送到 HttpHandler 但是当我在 HttpContext 中收到请求时 inputStream 为空 所以 a 发送时我不确定我的 HttpWebRequest 是否有效 b 在接收时我不确定如何检索 Http
  • 当前目录中包含多个 jar 文件的 javac 类路径选项导致错误

    环境 Windows 7 Java 6 尝试使用 cp 选项编译 java 文件 该文件使用当前目录中的单个 jar 文件以及当前目录中的一些其他 jar 文件 javac cp jar MyFile java 不起作用 javac cp
  • 未经授权的请求后抑制 NTLM 对话框

    在最近的一个共享点项目中 我实现了一个身份验证 Web 部件 它应该取代 NTLM 身份验证对话框 只要用户提供有效的凭据 它就可以正常工作 每当用户提供无效凭据时 Internet Explorer 中就会弹出 NTLM 对话框 我的 J
  • 获取文件的创建日期/时间

    这似乎是一个非常简单的问题 但我无法在网上找到明确的答案 如何通过 Java 的文件管理器获取文件创建的日期 时间 除了文件名之外 我还能获得有关文件 属性 的哪些信息 我不确定如何使用 Java 6 及更低版本获得它 使用 Java 7
  • 零除错误 (Python)

    我收到一些图像的零除错误 尽管其中很多都工作得很好 这是代码 image skimage io imread test png False image gray skimage io imread test png True blurred
  • 为什么模板只能在头文件中实现?

    引用自C 标准库 教程和手册 目前使用模板的唯一可移植方法是通过使用内联函数在头文件中实现它们 为什么是这样 澄清 头文件不是only便携式解决方案 但它们是最方便的便携式解决方案 警告 它是not有必要将实现放入头文件中 请参阅本答案末尾
  • 无法在 LazyColumn 中使用屏幕底部的 TextField

    我有这个代码 setContent val items mutableListOf
  • 迁移到 AndroidX

    好吧 我开始从一个一年前的项目迁移到 AndroidX 此后一直没有动过 但我在资源和 gradle 构建方面遇到了问题 我完全迷失了新的命名空间 我更改了其中一些命名空间 我升级了 AndroidStudio 告诉我的所有内容 但仍然无法
  • sdkman安装的`sdk`命令在哪里

    我刚刚安装sdkman用于在我的机器 MacOS 上安装 grails 当我跑步时which sdk命令我没有得到任何输出 但是当我运行sdk help命令 shell 能够解析它并给出正确的输出 我检查了 PATH 环境变量中提到的所有目
  • React Native - 如何从 ScrollView 获取视图的 Y 偏移值?

    我正在尝试获取视图的滚动位置 但价值为页面的 Y 偏移量这与视图的位置无关 滚动视图层次结构
  • 在 Android 模拟器中切换到横向模式

    这可能是一个很容易回答的问题 但在搜索文档和谷歌几个小时后我自己找不到解决方案 我将 Android 应用程序的方向设置为landscape in the AndroidManifest xml file android screenOri
  • 第一次触发事件时,按键事件不会记录输入值

    第一次keypress事件触发时 即使输入有值 它也会记录一个空输入值 第二次它记录该值 但与输入值相比晚了一次击键 您可以在下一个示例中检查此行为 document addEventListener DOMContentLoaded gt
  • 在 64 位 Linux 机器上用 gcc 生成“长”4 个字节

    我正在致力于将应用程序移植到 Linux 平台上的 64 位 该应用程序目前支持 Linux Windows Mac 32 位和 Windows 64 位 我们经常遇到的问题之一是使用 long 代替 int 反之亦然 到目前为止这还不是问
  • WPF在WPF窗口中打开exe程序

    不确定这是否可行 但有没有办法在 WPF 窗口的容器中打开另一个程序 例如记事本 类似于使用 webbrowser 控件打开网页 基本上我想打开记事本或其他 exe 但使用 xaml c 代码将其限制在 WPF 窗口容器内 不确定是否可能
  • 使用 ActionBar 选项卡在 onCreateView 中获取 Google 地图片段

    我正在尝试在 ActionBar 中使用选项卡时检索 Google 地图片段 当我加载选项卡式页面时 地图加载正常 但我想获取地图对象 以便可以将其居中 添加标记等 有没有办法做到这一点 如果有的话 有人会好心告诉我怎么做吗 这是我的标签页
  • PHP - 如何将 base_convert() 转换为基数 62

    我需要一个base convert 函数的工作范围从基数 2 到基数 62 但我缺少需要使用的数学 我知道由于 PHP 的限制 我需要使用 bcmath 这很好 功能像这些将数字与以 10 为基数的数字转换为另一个以 62 为基数的数字 但
  • 防止移动浏览器中的显示关闭

    我正在创建一个基于移动设备的网页 并且正在使用网络套接字连接来处理聊天室 但我希望每次用户通过移动浏览器访问网页时都会打开显示 我尝试模拟按钮点击 function eventFire el etype if el fireEvent el
  • 异步方法在第一个“等待”之前可以有昂贵的代码吗?

    在第一个异步方法之前 在异步方法的开始处使用昂贵的代码是否不好 await叫做 这段代码是否应该用TaskEx Run反而 public async Task Foo Do some initial expensive stuff Firs