C# 具有两个等待的异步调用的异步函数,其中第二个调用需要第一个调用的结果

C# 具有两个等待的异步调用的异步函数,其中第二个调用需要第一个调用的结果,c#,.net,asynchronous,C#,.net,Asynchronous,所以我有一个函数,看起来像: async Task DoSomething() { var result = await GetDataForAsyncCall2(); if (result != null) { await AsyncCall2(result.result1, result.result2); } } 我的问题是,每当我尝试调用它时,它似乎会在调用GetDataForAsyncCall2之

所以我有一个函数,看起来像:

    async Task DoSomething() {
        var result = await GetDataForAsyncCall2();
        if (result != null) {
            await AsyncCall2(result.result1, result.result2);
        }
    }
我的问题是,每当我尝试调用它时,它似乎会在调用GetDataForAsyncCall2之后从函数返回。但是我想要从函数得到的实际结果是AsyncCall2

为什么我的函数会在第一次等待之后返回,或者如何确保在函数返回之前运行第二次等待

为什么我的函数会在第一次等待后返回

事实上,你问的问题表明,你一定有一些完全错误的信念等待做什么。这就像是在问为什么返回。等待是一种回报。就像yield return是迭代器块中的一种返回一样。收益回报和等待在某种程度上本质上是一样的;在这两个点上,工作流将返回其调用方并注册方法的其余部分以在将来运行

您可能需要研究一下wait在C中的实际含义。简单地说,wait的意思是如果这个任务的结果不可用,那么返回给我的调用者,这样它就可以继续工作。在我等待的任务完成后的某个时间,在这一点上开始。也就是说,异步等待任务完成

如果这是您在方法中命中的第一个wait,那么返回给调用者的东西将是一个表示方法本身的任务,因为现在它也没有完成,调用者可能希望等待它

但这种简单的解释可能还不够。您应该阅读一些文章或教程,了解其工作原理,以便更有效地使用它

如何确保在函数返回之前运行第二次等待

你没有。那是故意的。等待允许您识别异步工作流中的点,1是高延迟操作,2是在工作流其余部分执行之前必须完成操作的点。等待的顺序正确地表示了第二个高延迟任务对第一个任务的数据依赖关系。系统正在按设计工作

但是我想要从函数得到的实际结果是AsyncCall2

我假设您所追求的结果是一个副作用,因为没有从AsyncCall2中提取任何值,并且您有一个从该方法返回的无值任务

这正是你得到的。您的方法返回一个任务,该任务将在AsyncCall2返回的任务完成后的某个时间点标记为已完成。如果调用方希望在将来异步等待该时间,那么它应该等待返回的任务

再次强调:等待是异步工作流中的一个点,我们知道在等待之前,任务可能尚未完成,在等待之后,任务肯定已经完成

您没有问的问题:

我是否应该使用.Result或类似工具同步等待高延迟操作来解决问题

不。这不仅违背了使用wait管理延迟的全部目的。它也会让你永远等待。有关一些示例,请参见

这些例子很有教育意义;我会非常仔细地阅读它们,直到你完全理解Wait是如何工作的

为什么我的函数会在第一次等待后返回

事实上,你问的问题表明,你一定有一些完全错误的信念等待做什么。这就像是在问为什么返回。等待是一种回报。就像yield return是迭代器块中的一种返回一样。收益回报和等待在某种程度上本质上是一样的;在这两个点上,工作流将返回其调用方并注册方法的其余部分以在将来运行

您可能需要研究一下wait在C中的实际含义。简单地说,wait的意思是如果这个任务的结果不可用,那么返回给我的调用者,这样它就可以继续工作。在我等待的任务完成后的某个时间,在这一点上开始。也就是说,异步等待任务完成

如果这是您在方法中命中的第一个wait,那么返回给调用者的东西将是一个表示方法本身的任务,因为现在它也没有完成,调用者可能希望等待它

但这种简单的解释可能还不够。您应该阅读一些文章或教程,了解其工作原理,以便更有效地使用它

如何确保在函数返回之前运行第二次等待

你没有。那是故意的。等待允许您识别异步工作流中的点,1是高延迟操作,2是在工作流其余部分执行之前必须完成操作的点。等待的序列正确地表示第二高la的数据相关性 第一个任务上的tency任务。系统正在按设计工作

但是我想要从函数得到的实际结果是AsyncCall2

我假设您所追求的结果是一个副作用,因为没有从AsyncCall2中提取任何值,并且您有一个从该方法返回的无值任务

这正是你得到的。您的方法返回一个任务,该任务将在AsyncCall2返回的任务完成后的某个时间点标记为已完成。如果调用方希望在将来异步等待该时间,那么它应该等待返回的任务

再次强调:等待是异步工作流中的一个点,我们知道在等待之前,任务可能尚未完成,在等待之后,任务肯定已经完成

您没有问的问题:

我是否应该使用.Result或类似工具同步等待高延迟操作来解决问题

不。这不仅违背了使用wait管理延迟的全部目的。它也会让你永远等待。有关一些示例,请参见


这些例子很有教育意义;我会非常仔细地阅读它们,直到您完全理解Wait是如何工作的。

您正在等待第二个任务,假设结果不是空的,Wait就是这样工作的;异步调用完成后,它将返回到您的函数。您是否使用wait调用您的方法?例如:等待做某事;?或者你仅仅是在说某件事;如果在第一次等待之后结果为null,那么它将从方法返回。调试代码并验证是否确实从GetDataForAsyncCall2返回了结果。您可能希望查看“continue with”方法。您正在等待第二个任务,假设结果不是空的,这就是等待的工作方式;异步调用完成后,它将返回到您的函数。您是否使用wait调用您的方法?例如:等待做某事;?或者你仅仅是在说某件事;如果在第一次等待之后结果为null,那么它将从方法返回。调试代码并验证是否确实从GetDataForAsyncCall2返回了结果。您可能希望查看“continue with”方法。