我想更好地理解几个涉及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以来,这是通常的任务行为。那么被引用的句子有什么意义呢?