我想更好地理解几个涉及 C# 7.0 丢弃功能的使用的示例。
他们都利用所谓的单独丢弃 https://learn.microsoft.com/en-us/dotnet/csharp/discards#a-standalone-discard.
这是第一个让我困惑的例子,可用here https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2#httpcontext-access-from-a-background-thread:
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
有什么用吗?上面的代码和同样的代码有什么区别without的分配SendEmailCore(correlationId)
到丢弃表达式_
?运行时行为有什么区别吗?
这是第二个代码示例,可用here https://learn.microsoft.com/en-us/dotnet/csharp/discards#a-standalone-discard:
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
在任何情况下都会被运行时忽略,即程序成功完成有还是没有丢弃表达式。
This is not与丢弃表达式本身相关,但与返回的任务被放弃并且未观察到其异常这一事实有关。未等待任务且未调用Task.Wait
,所以CLR会忽略异常,进程不会崩溃;这是自 .NET 4.5 以来常见的任务行为。那么引用的这句话有什么意义呢?