从MVC控制器调用异步方法

时间:2014-05-25 07:22:37

标签: asp.net-mvc asp.net-mvc-5 async-await

我试图从MVC5控制器异步发送短信。

在控制器中,我调用以下方法,该方法在另一个类中。我不需要该方法的任何回复,如果失败则不在乎。

    public async void SendSMS(string phoneNumber, string message)
    {
        await Task.Run(() =>
            {
                TwilioRestClient twilio = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
                twilio.SendSmsMessage(TWILIO_PHONE_NUMBER, phoneNumber, message);
            }
        );
    }

这对我来说并不适合,因为它似乎同步运行。有关如何改进代码并使其进入正常工作状态的任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:6)

当您await Task(或任何其他awaitable)时,您告诉编译器“我正在执行此任务并让控制权回馈给您”。发生的事情是控制权返回给调用者,直到Task完成执行,编译器生成一个状态机,一旦完成就会返回await

在你的方法中,你不需要任何这些。

我将声明我不是火的粉丝而忘记了方法,我认为你应该添加一个延续来处理任务失败,即使你不关心它是否成功。 如果您使用.NET 4.0未处理Task异常,则会导致您的流程在终结器处理Task时终止。

您可以从方法签名中删除async,因为您不需要await并返回Task代替:

public Task SendSMS(string phoneNumber, string message)
{
    return Task.Run(() =>
    {
        TwilioRestClient twilio = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
        twilio.SendSmsMessage(TWILIO_PHONE_NUMBER, phoneNumber, message);
    });
}