从MVC控制器调用异步方法

7

我正在尝试从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个回答

6
当你使用await关键字等待一个Task(或任何其他可等待对象)时,你告诉编译器:“我正在执行这个任务并将控制权交给你”。发生的情况是,控制权被返回给调用者,直到Task完成执行,编译器生成一个状态机,在完成后返回到await
在你的方法中,你不需要任何这些。
我要说的是,我不喜欢“fire and forget”方法,即使你不关心它是否成功,我认为你应该添加一个继续处理任务失败的方法。 如果你使用的是.NET 4.0,不处理Task异常会导致在终结器处置Task时进程终止。
由于你不需要await,所以可以从方法签名中删除async并返回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);
    });
}

正常工作。谢谢。 - jed
1
应该使用 HostingEnvironment.QueueBackgroundWorkItem 而不是 Task.Run。 在 ASP.NET 上使用 Task.Run 是非常危险的;而 QueueBackgroundWorkItem 只是有些危险。 - Stephen Cleary
1
可以详细说明一下为什么这很危险吗?或者写一篇博客文章? :) - Yuval Itzchakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接