在 C# 中"async void"和跳过"await"关键字有什么区别?



两者有什么区别

MyFireAndForgetMethod();   
public async void MyFireAndForgetMethod(){}

MyFireAndForgetMethod(); // Will have a warning here
public async Task MyFireAndForgetMethod(){}

我不确定该使用哪个来调用指标。

区别在于async void是用于触发和忘记调用,通常是事件处理程序,async Taskasync Task<T>是正常情况。

Task对象用于await方法的完成、检索结果并使用标准trycatch捕获可能的异常。

你永远不应该编写一个异步的 void 方法,因为你不能等待它。你应该总是等待异步,否则你会吞下异常。如果你没有从函数返回任何明智的东西,只需返回一个非泛型 Task 的实例 - 因此可以等待它。

"火后忘是没问题的——只要你永远不会忘记。"对于几种形式的多任务处理,吞咽异常存在整个问题。TPL与多线程一样严重。任务的执行可能会引发异常。这些可能是致命的,永远不应该被抓住——更不用说默默地吞下(遗忘(了。通常你必须编写非常糟糕的尝试/捕获代码,但对于Multtitask,你必须主动避免它。任务和等待,是你避免它的方式(实际上并没有忘记(。而异步空洞是(几乎(保证吞咽

Task 实例将异常包含在一个整洁的列表中。等待会重新扔掉它们。没有例外会因为 Multtiask 而被吞噬(当然,您仍然有其他方法来搞砸这部分(。

如果你没有合理的等待地点,你可以写一个子任务,其唯一目的是查看和处理它的父异常。但是,您仍然必须终止致命或笨拙的Excetpions上的进程,并最终得到重复的异常处理程序。最好在主程序流中等待这一切,在那里你希望得到全局日志记录代码。

相关内容

最新更新