【问题标题】:Calling async method from MVC controller从 MVC 控制器调用异步方法
【发布时间】:2014-07-14 05:12:03
【问题描述】:

我正在尝试从 MVC5 控制器异步发送 SMS。

在控制器中,我调用了另一个类中的以下方法。我不需要该方法的任何响应,也不关心它是否失败。

    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);
            }
        );
    }

这对我不起作用,因为它似乎是同步运行的。任何有关如何改进代码并使其正常工作的提示都值得赞赏。

【问题讨论】:

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


    【解决方案1】:

    当您 awaitTask(或任何其他 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);
        });
    }
    

    【讨论】:

    • 按预期工作。谢谢。
    • 应该使用HostingEnvironment.QueueBackgroundWorkItem 而不是Task.RunTask.Run 在 ASP.NET 上非常危险; QueueBackgroundWorkItem 只是有点危险。
    • 关心扩展为什么它很危险?也许是一篇博文? :)
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多