【问题标题】:What if I don't wait for an async method when calling it for a synchronous method in asp.net?如果我在 asp.net 中为同步方法调用异步方法时不等待异步方法怎么办?
【发布时间】:2019-06-03 01:41:28
【问题描述】:

我有两种通过电子邮件和短信异步发送 otp 的方法。

现在,我从我的同步事件处理程序方法中调用它们。

这很好用。我通过 SMS 和电子邮件收到 OTP。但我想知道它是否正确,或者我应该让我的事件异步并等待两种方法发送 otp。

请注意,我的异步方法不需要任何结果/返回值。我只需要他们尽自己的一份力量。

我在网上搜索过答案,但没有人能解开我的疑问。 请帮忙。我是异步/等待的新手。

public async Task SendEmail(int otp) {}
public async Task SendSMS(int otp) {}

protected void SendOTP_OnClick(object sender, EventArgs e){
    // Do Something with database...
    int otp=1234;
    SendEmail(otp);
    SendSMS(otp);
}

【问题讨论】:

  • 在这种情况下,您将一劳永逸地使用这两种方法。如果它们抛出异常,您永远不会知道,或者您必须在这些方法中添加适当的异常处理。 SendOTP_OnClick 将调用 SendEmail 和 SendSMS,当它们自己等待异步操作时它们都应该返回,然后 SendOTP_OnClick 将在这些方法完成之前继续。
  • 基本上,执行将在它们完成之前继续。如果您不需要任何返回值,那很好,但您不确定它们何时完成。如果这是长期运行的任务,您可能需要等待它们,因为您可能需要该信息来处理其他一些事情。
  • 嗨 Lasse 和 Harun,就我而言,我在每个方法中都有异常处理代码,我在其中记录异常。所以如果不在 SendOTP_OnClick 中等待他们,我的邮件和短信会被发送吗? (只要不出现异常)

标签: c# asp.net async-await


【解决方案1】:

请注意,我的异步方法不需要任何结果/返回值。我只需要他们尽自己的一份力量。

您是否需要知道他们是否尽职尽责?方法的结果不仅包括返回值,还包括它是成功(返回成功)还是失败(抛出异常)的指示。如果您需要知道这些方法是否失败,那么您不能使用即发即弃。

我想知道它是否正确,或者我应该让我的事件异步并等待两种方法发送 otp。

绝大多数时候,开发人员确实想知道他们的方法是否失败,所以最好await

【讨论】:

  • 嗨,斯蒂芬。我只是想确定他们已经完成了自己的职责,即成功了。就我而言,它发送短信和电子邮件。如果它们抛出异常,我会在每个异常处理代码中分别使用 try catch 块,在其中记录异常。
  • @Abhishek:即使他们正在做自己的异常日志记录,您的应用程序(或您的应用程序主机)如何知道它们何时完成,所以它知道何时可以退出? ASP.NET 将定期重新启动您的应用程序,如果您使用即发即弃,那么您的电子邮件/短信方法可能会被终止。没有通知、异常或日志记录。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多