C#7.0独立丢弃混乱

时间:2019-07-03 17:09:45

标签: c# c#-7.0

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

它们两个都利用了所谓的stand alone discard

这是使我感到困惑的第一个示例,here可用:

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
    }
}

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

这是第二个代码示例,here可用:

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");
   }
}

同样,我看不到丢弃表达式_的分配的用处,我在Visual Studio中尝试了该示例,但似乎无论有没有废弃表达式,运行时行为都是相同的。 此外,在示例说明中,以下句子使我更加困惑:

  

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

在任何情况下,运行程序都会忽略对Task.Run的调用中引发的异常,即程序成功完成带有或不带有丢弃表达式的情况。

这与丢弃表达式本身无关,但是与以下事实有关:返回的任务被放弃并且未观察到其异常。没有等待任务,也没有对Task.Wait的调用,因此CLR会忽略该异常,并且该过程不会崩溃。自.NET 4.5以来,这是通常的任务行为。那么被引用的句子有什么意义呢?

0 个答案:

没有答案