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