我想弄清楚如何从 MVC 中的 Application_Error 方法创建异步调用。
我有一个我编写的电子邮件 dll,它使用 Smtp 客户端通过异步调用发送电子邮件。
问题是,当我在我的 dll 中调用 SendEmail 方法时,我有需要等待调用的冲突。现在,如果我尝试这样的事情:
protected async void Application_Error()
{
var await emailService.SendEmail("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
它不会工作,该方法甚至永远不会被调用。
有没有办法从同步方法进行异步调用?我的在线研究暗示HttpServerUtility.TransferRequest可能是答案,但我无法弄清楚如何使其符合我的要求,目前对我来说没有意义。
dll 的限制,我无法更改它。
我不知道为什么异步调用不发送电子邮件。它应该。某处有错误。
但解决方法是:
Task.Run(async () => { await emailService.SendEmail("Hello World"); }).Wait();
Run Code Online (Sandbox Code Playgroud)
您可以简化和优化它,但这是传达该想法的最简单方法。此模式始终是同步调用异步方法的安全方法。对性能不利,但在这里并不重要,因为发送电子邮件比开销贵 1000 倍。
如果您想保留异步行为,您可以删除Wait. 尽管那时我想知道为什么发送一开始就不起作用。该错误是由异步行为触发的还是始终存在?!