这是我的问题:我需要在ApiController中调用多个第三方方法。这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData)
。在ApiController将数据发送回客户端之后,我希望这些调用继续在后台运行。当DoSomethingAsync
完成时,我想做一些日志记录,并可能将一些数据保存到文件系统中。我怎样才能做到这一点?我更喜欢使用asyny / await语法。
答案 0 :(得分:22)
好消息,.NET 4.5.2中有一个名为QueueBackgroundWorkItem API的新解决方案。使用起来非常简单:
HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c));
这是一篇详细描述它的文章。
这里有一篇文章提到了一些其他未提及的方法。 http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
答案 1 :(得分:17)
你几乎不想这样做。这几乎总是一个大错误。
ASP.NET(以及大多数其他服务器)的工作假设是,一旦所有请求完成,就可以安全地拆除服务。因此,无保证您的日志记录将完成,或者您的数据将被写入磁盘。特别是在磁盘写入时,您的写入完全可能已损坏。
也就是说,如果你绝对确定你想要实现这个极其危险的设计,你可以使用BackgroundTaskManager
from my blog。
答案 2 :(得分:8)
也许你应该创建一个单独的服务来执行那些即发即弃的任务。那个服务可以是一个不同的ApiController,一个队列后面的工作者,任何可以独立托管并具有独立生命周期的东西。
这将使不同任务生命周期的管理变得更加容易,并将长期运行任务的关注点与ApiController的核心职责分开。
答案 3 :(得分:3)
正如其他人所指出的,不推荐。但是,只要有需要,就有办法,所以请看IRegisteredObject
另见
答案 4 :(得分:1)
尽管这个问题已有多年历史,但现在最好的解决方案是在这种情况下使用Singal R。