代码之家  ›  专栏  ›  技术社区  ›  Zoltán Király

异步警告让我困惑

  •  -1
  • Zoltán Király  · 技术社区  · 7 年前

    这不是一个调试类型的问题,我只是在寻找AsycChronous编程领域的特定教育,这是一个公认的我不在家的领域,在这里。

    我正在编写一个程序,我需要它在执行其他功能的同时定期进行调用。我研究了如何编写一个异步方法来实现这一点,并使其实际工作。

    令我困惑的是,当我从主方法调用它时,我收到一条警告,说我应该使用wait关键字来让程序等待方法调用完成,否则我可能无法获得预期的行为,这对我来说很奇怪。按照我的理解,编写异步方法的关键是让它运行,然后在不等待它完成的情况下继续运行,因此注意警告会破坏目标。另一方面,我并不傲慢地认为自己比开发Visual Studio并添加警告的专业人员更了解,因此在添加await关键字时,一定会有更多的情况比不添加await关键字更有意义。

    我的问题是:异步方法通常是如何使用的,以保证注意到这个警告?

    编辑:人们请求的代码和特定的警告文本,因此:

    异步方法:

    public static async Task FindPairs(TimeSpan interval, CancellationToken cancellationToken)
                {
                while (true)
                    {
                    lock (relevantVariable)
                        {
                        doStuffEveryInterval();
                        }
                    await Task.Delay(interval, cancellationToken);
                    }
                }
    

    警告是:“由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“wait”运算符应用于调用结果。当前方法调用一个异步方法,该方法返回一个任务或一个任务,并且不将await运算符应用于结果。对Async方法的调用将启动异步任务。但是,由于没有应用等待运算符,因此程序继续运行,而不等待任务完成。在大多数情况下,这种行为不是你所期望的。通常,调用方法的其他方面取决于调用的结果,或者至少在从包含调用的方法返回之前,被调用方法应该完成。

    一个同样重要的问题是,在被调用的异步方法中引发的异常会发生什么。在返回任务或任务的方法中引发的异常存储在返回的任务中。如果不等待任务或不显式检查异常,则会丢失异常。如果您等待该任务,则它的异常将被重新引发。

    作为一个最佳实践,你应该一直等待电话。

    只有当您确定不希望等待异步调用完成,并且被调用的方法不会引发任何异常时,才应考虑取消警告。在这种情况下,可以通过将调用的任务结果分配给变量来取消警告。”

    1 回复  |  直到 7 年前
        1
  •  8
  •   Eric Lippert    7 年前

    await Delay

    x = foo(); foo


    Task void void never

    never void