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