C# 7.0 独立丢弃混淆

Enr*_*one 8 c# c#-7.0

我想更好地理解几个涉及 C# 7.0 丢弃功能使用的示例。

他们都利用了所谓的独立丢弃

这是第一个让我困惑的例子,可以在这里找到

public class EmailController
{
    public ActionResult SendEmail(string email)
    {
        var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();

        // Starts sending an email, but doesn't wait for it to complete
        _ = SendEmailCore(correlationId);
        return View();
    }

    private async Task SendEmailCore(string correlationId)
    {
        // send the email
    }
}
Run Code Online (Sandbox Code Playgroud)

调用时使用的独立丢弃是否SendEmailCore有用?上面的代码和没有分配SendEmailCore(correlationId)给丢弃表达式的相同代码有什么区别_?运行时行为有什么不同吗?

这是第二个代码示例,可在此处获得

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      ExecuteAsyncMethods().Wait();
   }

   private static async Task ExecuteAsyncMethods()
   {    
      Console.WriteLine("About to launch a task...");
      _ = Task.Run(() => { var iterations = 0;  
                           for (int ctr = 0; ctr < int.MaxValue; ctr++)
                              iterations++;
                           Console.WriteLine("Completed looping operation...");
                           throw new InvalidOperationException();
                         });
      await Task.Delay(5000);                        
      Console.WriteLine("Exiting after 5 second delay");
   }
}
Run Code Online (Sandbox Code Playgroud)

再次,我看不到分配给丢弃表达式的用处_,我在 Visual Studio 中尝试了这个示例,但似乎运行时行为与丢弃表达式相同。此外,在示例描述中有以下句子更让我困惑:

以下示例使用独立丢弃来忽略异步操作返回的 Task 对象。这具有抑制操作即将完成时抛出的异常的效果。

Task.Run在任何情况下,运行时都会忽略调用内部引发的异常,无论是否使用丢弃表达式,程序都会成功完成。

涉及到丢弃表达本身,而是一个事实,即返回的任务被放弃,没有观察到它的异常。不等待任务并且没有调用Task.Wait,因此 CLR 会忽略异常并且进程不会崩溃;这是自 .NET 4.5 以来通常的任务行为。那么引用的句子有什么意义呢?