我试图从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);
}
);
}
这对我来说并不适合,因为它似乎同步运行。有关如何改进代码并使其进入正常工作状态的任何提示都表示赞赏。
答案 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);
});
}