【发布时间】:2020-04-25 15:37:10
【问题描述】:
我有以下场景,
public class User
{
public static async Task<bool> UserRegistration()
{
// So Many Async Async Await Methods
bool IsRegistrationSuccess = await RegisterUser();
if(IsRegistrationSuccess)
{
await SendSMS(); // Fire And Forget
await SendEmail(); // Fire And Forget
return true;
}
return false;
}
private static async Task SendSMS()
{
string URL = "http://www.example.com/dsad";
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(URL);
}
}
private static async Task SendEmail()
{
string emailMessage = "Some Email";
await EmailService.Send(emailMessage);
}
}
我想在没有等待的情况下拨打SendSMS(); 和SendEmail();。不想等待结果。
如果我这样做会发出警告,
因为没有等待这个调用,所以当前方法的执行在调用完成之前继续。考虑对调用结果应用运算符。
所以,问题是,如果UserRegistration() 方法在SendSMS() 或SendEmail() 完成之前返回,它会触发异常吗?在 Async Await 方法中进行 Fire and Forget 调用是一种好习惯吗?
【问题讨论】:
-
忽略您显示错误 fire and forget 的事实,如果您不在乎所有这些方法是否都失败,这非常奇怪...您确定这就是您想要吗?
-
不好的是,用户注册可能会失败,但会发送电子邮件(如果没有等待),这可能会令人沮丧。我想该电子邮件应该通知我用户注册结果,而不是用户注册尝试。
-
@oleksa 我已经更新了代码如果注册成功那么只有这些方法会被调用。
-
看,但如果不等待 UserRegistration (解雇并忘记它)你怎么知道它成功(或不成功)?这才是重点。
-
我明白了,谢谢。但是您对电子邮件或短信发送方法有一些错误处理吗?使用线程或异步方法如何创建这些火灾并忘记并不重要。所以我认为这很好。如果有人会发现此警告并决定通过添加异步来“修复”它,那么唯一的问题是。最好使用@gldraphael 建议隐藏警告
标签: c# async-await