WebAPI中长时间运行的任务

这是我的问题:我需要在ApiController中调用多个第三方方法。 这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData) 。 我希望这些调用在ApiController将数据发送回客户端后在后台继续运行。 当DoSomethingAsync完成时,我想做一些日志logging,也许保存一些数据到文件系统。 我怎样才能做到这一点? 我宁愿使用asyny / await语法。

Stephen描述了为什么在ApiController里面开始基本上长时间运行的“即燃即用”任务是一个坏主意。

也许你应该创build一个单独的服务来执行那些即将到来的任务。 该服务可以是不同的ApiController,队列后面的工作者,可以独立托pipe的任何东西,并具有独立的生命周期。

这将使不同任务生命周期的pipe理变得更容易,并将长期运行的任务与ApiController的核心职责分开。

你几乎从不想这样做。 这几乎总是一个很大的错误。

ASP.NET(以及大多数其他服务器)的工作原理是,一旦完成所有请求,就可以安全地取消服务。 所以你不能保证你的日志logging将会完成,或者你的数据将被写入磁盘。 特别是对于磁盘写入,写入操作完全可能会损坏。

也就是说,如果您确定要实现这个非常危险的devise,可以使用我的博客中的BackgroundTaskManager

好消息是,.NET 4.5.2中有一个新的解决scheme叫做QueueBackgroundWorkItem API。 这非常简单:

 HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c)); 

这里有一篇文章详细描述它。

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

这里有一篇文章提到了这个线程中没有提到的其他一些方法。 http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

正如别人指出的那样,不推荐。 但是,每当有需要的时候都有办法,所以看看IRegisteredObject

也可以看看

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/