我在发“异步”电子邮件。
我使用一个通用的‘异步’函数来调用电子邮件功能,因为我不需要等待电子邮件的响应。
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目的。
如何在不等待响应的情况下调用异步函数?
发布于 2015-03-23 12:44:47
你可以:
( A)创建一个“失火忘了”的请求,就像你试图做的那样。
或
( B)等待请求异步的结果。
方法A将使用两个线程,第一个线程是请求线程,第二个线程是火线程和遗忘线程。这将从请求线程池中窃取一个线程,导致在重载下线程饥饿。
当有事情要处理时,方法B将花费一个线程。请求线程,即。
方法B将消耗更少的资源,而方法A可能更快几毫秒,但代价是线程(读:昂贵!)。
当使用异步/等待时,线程只有在执行CPU工作时才是活动的,并且在执行IO绑定的工作时,线程被释放以服务其他请求/任务。
当启动一个新线程时,将阻塞该线程,直到它完成为止(除非您想要做一些复杂的线程同步)。
TL;DR:异步/等待的效率要高得多,如果您选择使用Fire并忘记,您最终将饥饿您的way服务器。
如果您仍然希望运行后台任务,则read this blog post: Search Results How to run Background Tasks in ASP.NET - Scott Hanselman
https://stackoverflow.com/questions/29210346
复制相似问题