繁体   English   中英

如何从非异步 web API 调用异步方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM