[英]How call async method from non async web API
我有 web api,这是非异步的。
从那个web api,我正在调用方法
SmtpClient.SendMailAsync(电子邮件);
这个 email 被发送给相应的人,但下一个 web api 请求获取失败。
public class TestController : ApiController
{
public TestController(TestService testService)
{
_testService = testService;
}
public IHttpActionResult Post(data)
{
_testService.SendEmail(data);
}
}
public class TestService
{
public async Task SendEmail(MailMessage email)
{
SmtpClient client = new SmtpClient();
client.SendMailAsync(email)
}
}
从引入异步/等待模式之前的日子开始,框架类中仍然存在许多非异步函数。
SmtpClient 客户端是足够老的类之一。 SendFunction 是您正在寻找的机器人:
https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.send
虽然命名有点偏离并且它们返回 void,但这些似乎是预异步函数。 在这两种情况下,都应该通过异常来传达失败。
鉴于您希望 SendEmail 表现得像火并忘记的评论,我建议使用
Task.Run(() => _testService.SendEmail(data));
这会将工作单元分配给线程池,并将您的请求从等待此任务的职责中解放出来。 一般来说,这被建议用于火灾和忘记。
根据经验,从同步上下文中调用异步事物通常是个坏主意。 一直做异步,或者为死锁做好准备。 例如,您可以简单地使您的 controller 操作也异步。
如果您需要使用一些发送结果:
public async IHttpActionResult Post(data)
{
var t = Task.Run(() =>_testService.SendEmail(data));
var result = await t;
// do something with result
}
- 当然你的 SendEmail function 应该返回Task<>
而不是Task
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.