Я хотел бы лучше понять пару примеров, связанных с использованием функции сброса 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
}
}
Является ли автономный сброс, используемый при вызове 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");
}
}
Опять же, я не вижуПолезность присвоения выражению отбрасывания _
, я попробовал пример в visual studio, но, похоже, поведение во время выполнения одинаково с выражением отбрасывания и без него.Кроме того, в описании примера есть следующее предложение, которое еще больше смущает меня:
В следующем примере используется автономное отбрасывание для игнорирования объекта Task, возвращаемого асинхронной операцией.Это приводит к подавлению исключения, которое выдает операция, когда она собирается завершиться.
Исключение, вызванное при вызове Task.Run
, игнорируется средой выполнения в любом случае, в том смысле, чточто программа успешно завершает с или без * выражения отбрасывания.
Это не , связанное с самим выражением сброса, но с тем фактом, что возвращаемая задача отмененаи его исключение не наблюдается.Задача не ожидается, и нет вызова Task.Wait
, поэтому CLR игнорирует исключение, и процесс не завершается сбоем;это обычное поведение Task начиная с .NET 4.5.Так какой смысл в цитируемом предложении?