multithreading - Xamarin 使用 async./wait VS await Task.Run(在 Xamarin 中)
问题描述
我一直在研究 async/await 与 await Task.Run 但没有找到明确的结论。
“异步/等待”是否总是在与 UI 不同的线程上运行?如果是,为什么要使用“等待Task.Run”?
根据我的研究,建议将“await Task.Run”用于 CPU 密集型任务,将“await/async”用于数据传输场景 (I/O),但其他人建议使用 await Task.Run(如果需要返回)或只需 Task.Run(即发即弃)即可在 Xamarin 中进行任何更长时间的运行活动。
那么,与仅 async/await 相比,“await Task.Run”的最佳用途是什么,尤其是在 Xamarin 的上下文中?
解决方案
“异步/等待”是否总是在与 UI 不同的线程上运行?
没有。
根据我的研究,建议将“await Task.Run”用于 CPU 密集型任务,将“await/async”用于数据传输场景 (I/O)
这是 UI 应用程序的一个很好的通用指南。普通async
/await
不使用额外的线程;它只是让你的 UI 保持响应。如果您有受 CPU 限制的代码,那么您确实需要另一个线程,因此您可以使用Task.Run
,并且您可以使用它来await
保持您的 UI 响应,同时后台线程运行受 CPU 限制的代码。
但其他人建议在 Xamarin 中使用 await Task.Run(如果需要返回)或只是 Task.Run(即发即弃)来进行任何更长时间运行的活动。
我不推荐一劳永逸。除其他问题外,它还可以隐藏异常。我建议始终使用await
.
那么,与仅 async/await 相比,“await Task.Run”的最佳用途是什么,尤其是在 Xamarin 的上下文中?
上面的一般规则是有效的:将async
/await
用于 I/O 操作和Task.Run
CPU 绑定操作。每隔一段时间,该规则就有一个例外。例如,有时 I/O 绑定操作是阻塞的,并且它们不提供完全异步的 API;await Task.Run
在这种情况下,即使操作在技术上受 I/O 限制而不是 CPU 限制,也可以正确使用阻止后台线程而不是 UI 线程。
进一步阅读:
推荐阅读
- javascript - ERR_STREAM_WRITE_AFTER_END 猫鼬错误
- php - 将分页添加到 wordpress 简码
- python - Python 记录器不打印信息
- javascript - 我想将一些代码移动到 react-native 的组件内部,但它会弄乱变量范围
- javascript - 在请求结束前使用 fetch 获取 HTTP 结果
- binary - 是数字还是字母(二进制转换)?
- javascript - 在语法正确的 JavaScript/jQuery 中,为什么执行永远不会超出`$('form').submit(function(event){`?
- c# - MetroListView 不隐藏文本,因为标题被缩短
- vue.js - 在 vuetify 中左右移除 padding/magrin
- python - 我正在尝试为我的代码的一部分导入图像,但它没有显示,但是它在不同的部分中进一步显示