我正在寻找“Fire & Forget”方法的最佳解决方案,并立即返回“View”。据我所知,我是否设置了 Action 的返回类型Task<ActionResult>
and await
异步方法它将起作用,但 Action 也在返回 View 之前等待异步方法完成expected.
另一方面,如果我不这样做await
异步方法,方法的执行将在View
返回。
我想问这样的情况最好的解决方案是什么?我的代码是这样的:
public class DefaultController : Controller
{
// GET: Default
public async Task<ActionResult> Index()
{
await Asynchronous();
return View();
}
public async Task Asynchronous()
{
var FilePath = ControllerContext.HttpContext.Server.MapPath("~/HelloWorld.txt");
for(int i = 0; i <= 100; i++)
{
await Task.Delay(15000); // Wait 15 Seconds.
System.IO.File.AppendAllLines(FilePath, new string[] { i.ToString() });
}
}
}
我正在寻找“Fire & Forget”方法的最佳解决方案,并立即返回“View”
这取决于“最好”的含义。 ASP.NET 上的“即发即忘”本质上是不安全的,因此您希望代码的安全程度存在不同程度的差异。
如果你的应用程序must继续执行,那么唯一安全的系统就是让您的操作处理程序将其想要执行的操作写入安全存储机制(例如 Azure 队列、MSMQ 或 SQL Server)。一旦安全存储,您的操作方法就可以返回。然后,您还将拥有一个独立的后台进程(例如,Azure Function、Win32 Service,或者可能是 ASP.NET 进程中的一个线程,前提是您非常小心它的托管方式)。该后台进程将从安全存储中读取数据并执行实际工作。
如果您的应用程序偶尔会“丢失”工作(在将成功返回给客户端之后),那么您可以使用不太安全的机制,例如HostingEnvironment.QueueBackgroundWorkItem
对于.NET 4.5.2,或者我的AspNetBackgroundTasks 库 https://github.com/StephenCleary/AspNetBackgroundTasks对于早期版本。
其他替代方案列于我关于这个主题的博客文章 http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)