我正在发送'Async'电子邮件。
我使用常见的“异步”功能来调用电子邮件功能,因为我不需要等待电子邮件的响应。
public Task SendAsync(....)
{
....
return mailClient.SendMailAsync(email);
}
我需要从async
和sync
函数调用它。
从异步功能调用
public async Task<ActionResult> AsyncFunction(...)
{
....
EmailClass.SendAsync(...);
....
// gives runtime error.
// "An asynchronous module or handler completed while an asynchronous operation was still pending..."
// Solved by using 'await EmailClass.SendAsync(...);'
}
从同步功能调用
public ActionResult syncFunction(...)
{
....
EmailClass.SendAsync(...);
....
// gives runtime error.
// "An asynchronous operation cannot be started at this time..."
// Solved by converting the function as above function
}
这两个函数都会给出运行时错误,然后在异步函数中使用await
关键字来解决。
但是通过使用await
,它违背了我running it on background without waiting for response
的目的。
如何在不等待响应的情况下调用异步函数?
答案 0 :(得分:1)
你可以:
A)创建一个“火与忘记”&#39;请求,正如您尝试的那样。
或
B)等待您的请求结果异步。
方法A将使用2个线程,第一个是你的请求线程,第二个是fire和forget线程。这会从请求线程池中窃取一个线程,导致在负载很重的情况下线程饥饿。
当有要处理的事情时,方法B将花费1个线程。请求线程是。
方法B将消耗更少的资源,而方法A可能会快几毫秒,但代价是一个线程(阅读:昂贵!)。
使用Async / await时,线程仅在执行CPU工作时处于活动状态,并在执行IO绑定工作时释放以供其他请求/任务使用。
在启动新线程时,将阻塞该线程直到完成(除非你想做一些复杂的线程同步)。
TL; DR :Async / Await效率更高,如果您选择使用Fire和Forget,最终会使您的网络服务器挨饿。
如果您仍想运行后台任务,read this blog post: Search Results How to run Background Tasks in ASP.NET - Scott Hanselman