【问题标题】:Fire and Forget Async Await Call触发并忘记异步等待调用
【发布时间】: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


【解决方案1】:

这只是一个警告,所以你知道它不是awaited。您可以使用 discard 来表明您不在乎它是否最终运行完成:

_ = SendSMS();

所以,问题是,如果 UserRegistration() 方法在 SendSMS() 或 SendEmail() 完成之前返回,它会触发异常吗?

没有。

在异步等待方法中进行 Fire and Forget 调用是一种好习惯吗?

在我看来不是。

【讨论】:

  • 那么,你能提供任何好的做法来实现同样的目标吗?
  • @SushantYelpale 你为什么不想等待?
  • 这两个 API 调用可能需要很长时间才能处理,我不想等待用户。
  • @SushantYelpale 将消息发布到队列。这将允许您在不同的地方等待。对于此类事情,Mediatr 是一个很好的进程内选项。但要回答您最初的问题,您不想等待异步方法。
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 2010-09-14
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2013-09-01
相关资源
最近更新 更多