Web API中的长时间运行任务

时间:2013-07-10 17:22:29

标签: task-parallel-library async-await asp.net-web-api

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

5 个答案:

答案 0 :(得分:22)

好消息,.NET 4.5.2中有一个名为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

答案 1 :(得分:17)

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

ASP.NET(以及大多数其他服务器)的工作假设是,一旦所有请求完成,就可以安全地拆除服务。因此,无保证您的日志记录将完成,或者您的数据将被写入磁盘。特别是在磁盘写入时,您的写入完全可能已损坏。

也就是说,如果你绝对确定你想要实现这个极其危险的设计,你可以使用BackgroundTaskManager from my blog

答案 2 :(得分:8)

史蒂芬描述了为什么在ApiController中开始基本上长时间运行的“即发即弃”任务是一个坏主意。

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

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

答案 3 :(得分:3)

正如其他人所指出的,不推荐。但是,只要有需要,就有办法,所以请看IRegisteredObject

另见

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

答案 4 :(得分:1)

尽管这个问题已有多年历史,但现在最好的解决方案是在这种情况下使用Singal R。

https://github.com/Myrmex/signalr-notify-progress