.NET MVC Fire和Forget Method也会立即返回View

时间:2016-12-24 00:51:19

标签: c# .net asp.net-mvc asynchronous

我正在寻找Fire&amp; amp;的最佳解决方案忘记Action上的方法并立即返回View。到目前为止,我可以看到我是否将Action的返回类型Task<ActionResult>await设置为异步方法,但是Action也在等待异步方法完成之后返回View为期望

另一方面,如果我没有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() });
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

我正在寻找Fire&amp; amp;的最佳解决方案忘记Action的方法并立即返回View

这取决于什么&#34;最好&#34;手段。 ASP.NET上的Fire和Forget本质上是不安全的,因此您希望代码的安全程度有不同程度。

如果您的应用必须继续执行,那么唯一安全的系统就是让您的操作处理程序将其想要做的事情写入安全存储机制(例如,Azure Queue,MSMQ或SQL Server) )。一旦安全存储,您的操作方法就可以返回。然后,您还将拥有一个独立的后台进程(例如,Azure功能,Win32服务,或者只有在您对其托管方式非常谨慎时,可能还是ASP.NET进程中的一个主题)。该后台进程将从安全存储中读取并执行实际工作。

如果你的应用程序偶尔会被罚款,那么#34;失败&#34;工作(在将成功返回给客户端之后),然后您可以使用安全性较低的机制,例如{4.5}用于.NET 4.5.2,或者AspNetBackgroundTasks library用于早期版本。

my blog post on the subject中列出了其他替代方案。