- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
虽然我在 .NET 中使用异步代码已有一段时间,但我最近才开始研究它并了解发生了什么。我一直在检查我的代码并试图改变它,所以如果一个任务可以与一些工作并行完成,那么它就是。例如:
var user = await _userRepo.GetByUsername(User.Identity.Name);
//Some minor work that doesn't rely on the user object
user = await _userRepo.UpdateLastAccessed(user, DateTime.Now);
return user;
现在变成:
var userTask = _userRepo.GetByUsername(User.Identity.Name);
//Some work that doesn't rely on the user object
user = await _userRepo.UpdateLastAccessed(userTask.Result, DateTime.Now);
return user;
我的理解是,用户对象现在正在从数据库中获取,同时一些不相关的工作正在进行。但是,我看到的帖子暗示 result 应该很少使用并且 await 是首选,但我不明白为什么我要等待我的用户对象被获取,如果我可以在同一时间?
最佳答案
让我们确保不要把 lede 埋在这里:
So for example: [some correct code] becomes [some incorrect code]
永远永远永远不要这样做。
您认为可以重组控制流以提高性能的直觉是极好的和正确的。使用 Result
这样做是错误的,错误的。
重写代码的正确方法是
var userTask = _userRepo.GetByUsername(User.Identity.Name);
//Some work that doesn't rely on the user object
user = await _userRepo.UpdateLastAccessed(await userTask, DateTime.Now);
return user;
请记住,await 不会进行异步调用。等待只是意味着“如果此任务的结果尚不可用,请去做其他事情并在可用后返回这里”。该调用已经是异步的:它返回一个任务。
人们似乎认为 await
具有共同调用的语义;它不是。相反,await 是任务 comonad 上的 extract 操作;它是任务的运算符,而不是调用表达式。您通常会在方法调用中看到它,因为它是将异步操作抽象为方法的常见模式。 返回的任务是等待的事情,而不是调用。
However, things I've seen posted imply that result should be used rarely and await is preferred but I don't understand why I'd want to wait for my user object to be fetched if I can be performing some other independent logic at the same time?
为什么您认为使用 Result
将允许您同时执行其他独立逻辑??? Result 会阻止你这样做。结果是同步等待。您的线程在同步等待任务完成时不能做任何其他工作。使用异步等待 来提高效率。请记住,await
仅表示“此工作流程无法进一步推进,直到此任务完成,因此如果未完成,请找到更多工作要做,稍后再回来”。正如您所注意到的,过早的 await
可能会导致工作流效率低下,因为有时即使任务未完成,工作流也可以继续进行。
一定要在等待发生的地方移动以提高工作流的效率,但永远不要永远不要将它们更改为Result
。如果您认为使用 Result
将永远提高工作流中的并行效率,那么您对异步工作流的工作方式有一些深刻的误解。检查您的信念,看看您是否能找出是哪个信念给了您这种不正确的直觉。
你绝不能像这样使用 Result
的原因不仅仅是因为当你有一个正在进行的异步工作流时同步等待是低效的。 它最终会挂起你的进程。考虑以下工作流程:
task1
表示将被安排在将来此线程上执行并产生结果的作业。task1
的完成。task1
。task1
完成,触发Foo
工作流完成的执行,最终完成代表Foo
工作流的任务。 现在假设 Foo
改为获取 task1
的 Result
。怎么了? Foo
同步等待 task1
完成,它正在等待当前线程可用,这永远不会发生,因为我们处于同步等待。 如果任务以某种方式关联到当前线程,则调用 Result 会导致线程与自身发生死锁。您现在可以制造不涉及锁且只有一个线程的死锁!不要这样做。
关于c# - 什么时候使用 Task.Result 而不是等待 Task 的最佳位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47284290/
我有点困惑为什么在 RoutineRetrieved 函数中分配 ACTIVITYIMAGE 时使用 result.getInt(2) 并在分配 SLOT 时使用 result.getInt(3)..
我是android领域的新手,我想从响应json数组访问每个结果元素,但我无法做到这一点,我试图获取每个元素,但我只得到一个值“rohit1”是第一个元素。请帮助我。 我是 rohit parmar,
我只有从 sql 查询返回的一行 (count(*)),但在执行包时,它向我显示上述错误,并且包失败。 我将结果类型设置为“单行”,并将查询的输出(select count(*) as 'result
我正在尝试使用Diesel将简单的原始SQL转换为MySQL,如本示例所示: https://docs.diesel.rs/diesel/fn.sql_query.html let users = s
我正在尝试 Play 框架的第一个示例,但出现了此错误 在我的路线文件中: # API # ~~~~ GET /api/geotweets/index controllers.api.GeoTw
这段代码可以返回null吗? (this.Result == Result.OK) 此行(或类似行)是否可以返回除 true 或 false 之外的任何内容(例如 null)? 最佳答案 (this.
我有一个 SSIS 执行 SQL 任务。它返回一个完整的结果集(即一个表)。但是,当我执行包时出现以下错误。我已经正确地为返回的结果集命名。 [执行 SQL 任务] 错误:对于完整的结果集和 XML
最近我刚刚将 swift 2.3 项目转换为 3.2,alamofire 也得到了转换,我收到了很多问题,其中大部分都已解决,现在我被给定的两个问题所困扰 问题在 alamofire 的 Respon
我在 R 中收到以下错误消息: Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", : Unable to r
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。
我正在使用一个简单的命令运行以下存储过程sp_MSforeachdb。我的问题是如何限制结果仅显示至少有 1 条记录满足命令的数据库: 这是我的存储过程: EXECUTE master.sys.sp_
我在单独的线程中运行一些代码: fn f1() -> Result { Err("err1".to_string()) } fn f2() -> Result { Err("err2"
我在这里尝试使用 AsyncTask 从 OWM API 显示 7 天的天气预报。 doInBackground(String...param) 方法也工作正常。我检查了 LOGCAT。 异步完成执行
我已经创建了mysql的索引和全文索引,后端存储引擎是MyISAM。 mysql> show index from play_movie; +------------+------------+---
我有一个表articles,它的结构如下: id, name, date, contents 我有一个表authors,它的结构如下: id, article_id, name, email 一篇文章
我很困惑我们是否应该创建单独的 API 来获取结果和结果计数,或者我们应该只根据结果 API 中的查询字符串来获取计数。 /api/results/ : Fetches all records /ap
我正在制作一个将两个数字相除的系统,如果第二个数字不存在,它将选择第一个数字。这是代码: let new_num: f32 = match num1/num2 { Ok(num) => n
这个问题在这里已经有了答案: Why am I getting "unused Result which must be used ... Result may be an Err variant,
我正在修改 the texture synth 中的示例之一项目: use texture_synthesis as ts; fn main() -> Result { //create a
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: ^ operator in java 我假设 c ^ d是一个类似“的幂”的计算,所以c = 5 , d = 2 ,
我是一名优秀的程序员,十分优秀!