这不是一个调试类型的问题,我只是在asycnchronous编程领域寻找一个特定的教育,一个我不可否认的领域,在这里.
我正在编写一个程序,我需要它来定期拨打电话,同时还要执行其他功能.我查找了如何编写一个异步方法来实现这一点,并实际上让它工作.
令我困惑的是,当我从我的Main方法调用它时,我得到一个警告,说我应该使用await关键字让程序等待方法调用完成,否则我可能无法得到预期的行为,这是对我很奇怪.我认为,编写异步方法的关键在于让它运行,然后继续前进而不等待它完成,因此注意警告会破坏目的.另一方面,我并不傲慢地认为我比开发Visual Studio的专业人员更了解并添加了警告,因此必须有更多情况下添加await关键字更有意义.
我的问题是:通常使用的异步方法如何保证听到此警告?
编辑:人员请求代码和警告的特定文本,因此:
异步方法:
public static async Task FindPairs(TimeSpan interval, CancellationToken cancellationToken)
{
while (true)
{
lock (relevantVariable)
{
doStuffEveryInterval();
}
await Task.Delay(interval, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
并且警告是这样的:"因为没有等待这个调用,所以当前方法的执行在调用完成之前继续.考虑将'await'运算符应用于调用的结果.当前方法调用异步方法返回一个任务或任务并不将await运算符应用于结果.对异步方法的调用启动异步任务.但是,由于没有应用await运算符,程序会继续,而不会等待任务完成.在大多数情况下,这种行为不是你所期望的.通常调用方法的其他方面取决于调用的结果,或者最少,在从包含调用的方法返回之前,调用的方法应该完成.
同样重要的问题是在被调用的异步方法中引发的异常会发生什么.在返回任务或任务的方法中引发的异常存储在返回的任务中.如果您未等待任务或显式检查异常,则会丢失异常.如果等待该任务,则重新抛出异常.
作为最佳实践,您应该始终等待通话.
只有当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止警告.在这种情况下,您可以通过将调用的任务结果分配给变量来抑制警告."