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

时间:2019-11-14 05:35:49

标签: c# asp.net-web-api async-await

我正在使用非异步的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)
     }
}

3 个答案:

答案 0 :(得分:1)

从引入异步/等待模式开始的那一天开始,Framework类中仍然存在许多非异步功能。

SmtpClient客户端是为此而足够老的类之一。 SendFunction是您要寻找的机器人:

https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.send

虽然命名有点偏离并且它们返回void,但是这些似乎是预异步功能。在两种情况下都应通过“异常”来传达失败。

答案 1 :(得分:1)

鉴于您想让SendEmail表现得如火如荼而忘记的评论,我建议使用

Task.Run(() => _testService.SendEmail(data));

这会将工作单元分配给线程池,并使您的请求免于等待此任务的责任。通常建议您不要着火。

根据经验,从同步上下文中调用异步事物通常不是一个好主意。始终执行异步操作,或者为死锁做好准备。例如,您也可以简单地使控制器动作异步。

答案 2 :(得分:0)

如果您需要使用以下发送结果:

    public async IHttpActionResult Post(data)
 {
     var t = Task.Run(() =>_testService.SendEmail(data));

     var result = await t;
     // do something with result
 }

-但您的SendEmail函数当然应该返回Task<>而不是Task ...