异步方法中的最后一个异步调用需要等待吗?

亚历克斯

我不明白当异步方法调用是我的异步方法中的最后一个调用时是否需要await语句。例如

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    Call2Async(data);
}

public async Task Call1Async(byte[] data)
{
   ...
}

public async Task Call2Async(byte[] data)
{
   ...
}

上面的代码可以编译,但带有警告“请考虑将等待方式应用于此方法”。但是我认为,等待该方法中的最后一次调用会浪费资源。

同时,如果我使用return Call2Async(data);而不是just Call2Async(data);,警告将消失。这表明await在这种情况下实际上不是必需的。

但这仅适用于具有返回值的方法(即Task<T>,不只是Task)。对于没有返回值的方法,我需要此方法。有什么方法可以做同样的价值回报方法?

即我需要以某种方式将返回的Task对象返回Call2Async给调用方,CallAsync并且由于我的方法没有返回值,因此我不能显式地使用return语句CallAsync当然,我可以将它们全部调整为返回值(例如true),但这不是一个很好的解决方案。

PS:如果我的方法中只有异步调用,则只需在方法签名中不添加“ async”即可,并且它可以工作(不需要“ return”语句)。但是,如果该方法包含多个异步调用,则我需要具有“异步”修饰符,以便能够等待第一个调用“ await Call1Async(data)”。并且添加'async'修饰符使编译器需要'return'才能将Task对象返回给调用者(这仅适用于具有返回值的方法)。这就是我要克服的问题。

S队

在以下方法中:

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    Call2Async(data);
}

从方法开始的控制返回Call2Async也就是说,如果您愿意await CallAsync(data),它将在结束之前完成Call2Async这可能不是您想要的。仅当两个调用都完成时,此方法才会完成:

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    await Call2Async(data);
}

您可以在这些示例输出中看到差异(我实现了两个异步调用,以简单地打印开始,延迟一秒钟,然后打印结束)。

void Main()
{
    Console.WriteLine("Main start");
    CallAsync(null).Wait();
    Console.WriteLine("Main end");
}

没有第二次await打印的方法

Main start
Call1Async start
Call1Async end
Call2Async start
Main end
Call2Async end

第二个await

Main start
Call1Async start
Call1Async end
Call2Async start
Call2Async end
Main end

此实现也有一个问题:

public Task CallAsync(byte[] data)
{
    Call1Async(data);
    return Call2Async(data);
}

它同时启动两个异步调用,但是在Call2Async完成时返回控制,无论是否Call1Async完成。同样,这可能不是您想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Webflux中的另一个异步方法内进行异步调用?

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

如何同步调用异步(等待)方法?

来自分类Dev

无法等待异步调用中的对象

来自分类Dev

我应该如何使用在一个异步调用中返回的accessToken在另一个异步调用中?

来自分类Dev

当我需要等待事件时如何使方法异步

来自分类Dev

在异步生成器函数中是否需要等待?

来自分类Dev

AngularJS:等待异步调用

来自分类Dev

这些异步调用中的哪个与另一个不同?

来自分类Dev

“异步”调用图中的最后一个调用是否需要同步?

来自分类Dev

异步调用方法

来自分类Dev

异步调用完成后,回调/关闭如何知道要等待?

来自分类Dev

异步等待:即使一个错误,如何在多个等待调用中获取数据?

来自分类Dev

异步等待:即使一个错误,如何在多个等待调用中获取数据?

来自分类Dev

等待Azure Functions中的异步调用时是否需要/有利于ConfigureAwait(false)

来自分类Dev

iOS:在方法中包装异步调用

来自分类Dev

在C#中异步调用方法

来自分类Dev

React在异步调用中调度方法

来自分类Dev

在C#中异步调用方法

来自分类Dev

等待最后一个stream.on('data')事件中的异步函数回调

来自分类Dev

等待JS函数中的异步调用结束。(jQuery.Deferred吗?)

来自分类Dev

等待一个递归调用异步函数的函数

来自分类Dev

为什么在等待它的同时在同一行调用一个方法是异步的?

来自分类Dev

具有多个异步调用的 For 循环 - 重复打印第二个异步函数中的最后一项

来自分类Dev

从异步调用void同步方法-无法等待void

来自分类Dev

等待Scala应用程序中的异步调用终止

来自分类Dev

不等待lambda foreach中的异步调用

来自分类Dev

等待GWT异步调用中的数据库结果

来自分类Dev

等待XCTestCase的setUp()中的多个异步调用

Related 相关文章

  1. 1

    如何在Webflux中的另一个异步方法内进行异步调用?

  2. 2

    如何同步调用异步(等待)方法?

  3. 3

    如何同步调用异步(等待)方法?

  4. 4

    无法等待异步调用中的对象

  5. 5

    我应该如何使用在一个异步调用中返回的accessToken在另一个异步调用中?

  6. 6

    当我需要等待事件时如何使方法异步

  7. 7

    在异步生成器函数中是否需要等待?

  8. 8

    AngularJS:等待异步调用

  9. 9

    这些异步调用中的哪个与另一个不同?

  10. 10

    “异步”调用图中的最后一个调用是否需要同步?

  11. 11

    异步调用方法

  12. 12

    异步调用完成后,回调/关闭如何知道要等待?

  13. 13

    异步等待:即使一个错误,如何在多个等待调用中获取数据?

  14. 14

    异步等待:即使一个错误,如何在多个等待调用中获取数据?

  15. 15

    等待Azure Functions中的异步调用时是否需要/有利于ConfigureAwait(false)

  16. 16

    iOS:在方法中包装异步调用

  17. 17

    在C#中异步调用方法

  18. 18

    React在异步调用中调度方法

  19. 19

    在C#中异步调用方法

  20. 20

    等待最后一个stream.on('data')事件中的异步函数回调

  21. 21

    等待JS函数中的异步调用结束。(jQuery.Deferred吗?)

  22. 22

    等待一个递归调用异步函数的函数

  23. 23

    为什么在等待它的同时在同一行调用一个方法是异步的?

  24. 24

    具有多个异步调用的 For 循环 - 重复打印第二个异步函数中的最后一项

  25. 25

    从异步调用void同步方法-无法等待void

  26. 26

    等待Scala应用程序中的异步调用终止

  27. 27

    不等待lambda foreach中的异步调用

  28. 28

    等待GWT异步调用中的数据库结果

  29. 29

    等待XCTestCase的setUp()中的多个异步调用

热门标签

归档