gpt4 book ai didi

c# - 当你等待一个失败的任务时会发生什么

转载 作者:太空狗 更新时间:2023-10-29 21:12:45 25 4
gpt4 key购买 nike

我有一个理论上的问题要问你。如果我在另一个任务中等待任务的结果会怎样?我想知道我当前的系统之后是否可以正常工作。

任务启动并执行一些操作。在某些时候,该任务可能需要另一个任务来处理当前任务本身无法处理的数据。所以我用await来保证只要他没有helper任务的结果,当前任务就不会继续。但是如果助手失败了怎么办?当前任务会保持锁定状态吗?

我能否以某种方式避免这种死锁(无需更改系统本身 - 任务中的任务)?

最佳答案

A task gets launched and does some stuff. At some point that task might need another one in order to process data which the current task is not able to process by itself. So I use await to ensure that the current task won't continue as long as he has not the result of the helper task. But what happens if the helper fails? Will the current task remain locked?

asyncawait 背后的核心思想是异步代码的工作方式与同步代码几乎相同。

所以,如果你有这样的同步代码:

void HelperMethod()
{
throw new InvalidOperationException("test");
}

void DoStuff()
{
HelperMethod();
}

然后您会期望 DoStuff 从辅助方法传播 InvalidOperationException。同样,异步代码也会发生这种情况:

async Task HelperMethodAsync()
{
throw new InvalidOperationException("test");
}

async Task DoStuffAsync()
{
await HelperMethodAsync();
}

也就是说,DoStuffAsync 还将传播 InvalidOperationException

现在,它不会以完全的方式工作,当然,因为它必须是异步的,但一般的想法是您所有的控制流,例如 try/catchfor 循环等,所有这些都“仅适用于”异步代码,与同步代码非常相似。

实际上发生的事情是,当 HelperMethodInvalidOperationException 结束时,异常会被捕获并放置在返回的 Task 中,任务完成。当 DoStuffAsync 中的 await 发现任务已完成时,它会检查其异常并重新引发第一个(在本例中,只有一个,InvalidOperationException).它以一种保留异常调用堆栈的方式重新引发它。这反过来会导致从 DoStuffAsync 返回的 Task 完成,但出现相同的异常。

因此,在幕后 asyncawait 正在做一些工作以确保您可以使用 await 和使用 try/catch 的方式与在同步代码中的方式相同。但大多数时候您不必意识到这一点。

关于c# - 当你等待一个失败的任务时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com