为什么我必须使用await来使方法异步运行。如果我不想等待方法完成再继续怎么办?

恶魔

我整天都在浏览MSDN文档,他们的异步编码理念使我感到困惑。据我了解,调用async方法的线程不会被阻塞。但是,在示例中,异步总是与await配对,这似乎抵消了异步性,从而使外部方法必须等待代码无论如何执行。我是否应该能够调用异步方法然后继续执行外部方法?

这或多或少是我一直遇到的情况:

void reportSomethingHappened(info)
    - Collect info
    - HTTP POST info to logging server (ie. mixpanel, sentry)

这是一个调用方法:

void largerProcess
    if (whatever)
        reportSomethingHappened();
    bla;
    bla;

据我了解,由于POST请求可以异步完成,因此我应该能够使reportSomethingHappened()成为异步方法(通过AFAIK,等待webrequest,并添加async关键字)。

但是,largeProcess方法不需要等待(即等待)报告方法完成即可执行bla bla bla。但是,VS告诉我,使用异步方法,我可以等待它,也可以同步发生并阻塞。这是否会破坏单独进行的目的?

如何编写此代码,以便reportSomethingHappened不会阻止LargeProcess的执行?(这天生使我感到困惑,因为我一直认为那是异步的关键)

i3arnon

如果您调用异步方法,则无论您是否await返回任务,它都会异步运行

await不会影响该方法的执行方式,只会影响您作为调用方的处理方式。您可以调用async方法,获取任务并立即等待(这是最简单的选项)。这样一来,您就可以编写看似同步但异步运行await的代码,因为该代码基本上将其余代码注册为回调,仅在等待任务完成后才执行。在传统上这不会阻塞,因为没有线程被阻塞,但是代码流将是顺序的:

async Task LargerProcessAsync()
{
    if (condition)
    {
        await ReportSomethingHappenedAsync();
    }

    // do other stuff
}

但是,您不一定需要这样做。您可以将任务取回,做其他事情,然后再做await

async Task LargerProcessAsync()
{
    Task task = null;
    if (condition)
    {
        task = ReportSomethingHappenedAsync();
    }

    // do other stuff

    if (task != null)
    {
        await task;
    }
}

或者,您可以简单地将其await完全删除您应该意识到,这样做可能很危险,因为任务可能会出错,并且异常可能会被忽略,这就是为什么不鼓励这样做的原因。有几种方法可以做到这一点,但这并不简单。您可以使用Task.ContinueWith

void LargerProcess()
{
    if (condition)
    {
        ReportSomethingHappenedAsync().ContinueWith(task => 
        {
            try
            {
                task.Wait();
            }
            catch (Exception exception)
            {
                // handle exception
            }
        })
    }

    // do other stuff
}

或对于ASP.Net,请在ASP.NET上查看Fire and Forget

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果我使用了异步复位该怎么办,我是否必须将其设置为同步复位?

来自分类Dev

如果我不想在使用函数后输出“none”,我该怎么办

来自分类Dev

如果我们不等待异步 javascript 函数怎么办?

来自分类Dev

如果我不等待任务怎么办?

来自分类Dev

如果我在等待时不想做任何事情,使用实体框架异步方法有什么意义吗?

来自分类Java

如果我们想在不同的实现中多次使用mouseClick方法怎么办

来自分类Javascript

如果我们在调用方法后不小心不使用'()怎么办

来自分类Dev

如果我不想在我的帖子请求中硬编码值怎么办?

来自分类Dev

我使用MainCamera`ray来使GameObject碰撞,但是如果GameObject是Image,则无法碰撞Iamge,该怎么办?

来自分类Dev

是否可以等待未声明为异步的IO操作?如果没有,我该怎么办?

来自分类Dev

Twisted IPullProducer如果我什么都不写怎么办?

来自分类Dev

如果我不想要 Picker 的初始选定值怎么办?

来自分类Dev

如果我不想显示前10个记录列表,该怎么办?

来自分类Dev

如果我要使用的CD无法在ubuntu / linux上运行该怎么办

来自分类Dev

如果我在“接球”中使用“投掷”怎么办?

来自分类Java

我们可以在Java中使用null对象调用静态方法吗?如果是这样,怎么办?

来自分类Dev

如果我在printf方法中将所有%X替换为%p怎么办

来自分类Dev

为什么我们必须等待C#中的异步方法调用

来自分类Dev

为什么rc.local不运行我的所有命令,我该怎么办?

来自分类Dev

当这个问题出现时,如果我想继续我的代码怎么办?运行时错误:未找到最佳参数

来自分类Dev

如果我必须重写非虚拟成员函数怎么办

来自分类Dev

我是否必须在新的HDD / SSD上设置BIOS?如果是这样,怎么办?

来自分类Dev

newb git,如果我忘记签出 main 并且我的预定脚本运行怎么办?

来自分类Dev

我想运行“ HttpAsyncTask” ...我该怎么办?

来自分类Dev

用cont无法完成的callCC我该怎么办?

来自分类Dev

如果我想获取CycledLeScanCallback使用Android-Beacon-library我该怎么办

来自分类Dev

如果我的脚本运行时Elasticache决定重新分片怎么办?

来自分类Dev

如果我覆盖正在运行的Task实例怎么办?

来自分类Dev

如果调试无法正常运行(Eclipse IDE,Android SDK),我该怎么办?

Related 相关文章

  1. 1

    如果我使用了异步复位该怎么办,我是否必须将其设置为同步复位?

  2. 2

    如果我不想在使用函数后输出“none”,我该怎么办

  3. 3

    如果我们不等待异步 javascript 函数怎么办?

  4. 4

    如果我不等待任务怎么办?

  5. 5

    如果我在等待时不想做任何事情,使用实体框架异步方法有什么意义吗?

  6. 6

    如果我们想在不同的实现中多次使用mouseClick方法怎么办

  7. 7

    如果我们在调用方法后不小心不使用'()怎么办

  8. 8

    如果我不想在我的帖子请求中硬编码值怎么办?

  9. 9

    我使用MainCamera`ray来使GameObject碰撞,但是如果GameObject是Image,则无法碰撞Iamge,该怎么办?

  10. 10

    是否可以等待未声明为异步的IO操作?如果没有,我该怎么办?

  11. 11

    Twisted IPullProducer如果我什么都不写怎么办?

  12. 12

    如果我不想要 Picker 的初始选定值怎么办?

  13. 13

    如果我不想显示前10个记录列表,该怎么办?

  14. 14

    如果我要使用的CD无法在ubuntu / linux上运行该怎么办

  15. 15

    如果我在“接球”中使用“投掷”怎么办?

  16. 16

    我们可以在Java中使用null对象调用静态方法吗?如果是这样,怎么办?

  17. 17

    如果我在printf方法中将所有%X替换为%p怎么办

  18. 18

    为什么我们必须等待C#中的异步方法调用

  19. 19

    为什么rc.local不运行我的所有命令,我该怎么办?

  20. 20

    当这个问题出现时,如果我想继续我的代码怎么办?运行时错误:未找到最佳参数

  21. 21

    如果我必须重写非虚拟成员函数怎么办

  22. 22

    我是否必须在新的HDD / SSD上设置BIOS?如果是这样,怎么办?

  23. 23

    newb git,如果我忘记签出 main 并且我的预定脚本运行怎么办?

  24. 24

    我想运行“ HttpAsyncTask” ...我该怎么办?

  25. 25

    用cont无法完成的callCC我该怎么办?

  26. 26

    如果我想获取CycledLeScanCallback使用Android-Beacon-library我该怎么办

  27. 27

    如果我的脚本运行时Elasticache决定重新分片怎么办?

  28. 28

    如果我覆盖正在运行的Task实例怎么办?

  29. 29

    如果调试无法正常运行(Eclipse IDE,Android SDK),我该怎么办?

热门标签

归档