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));
这里有一篇文章详细描述它。
这里有一篇文章提到了这个线程中没有提到的其他一些方法。 http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
正如别人指出的那样,不推荐。 但是,每当有需要的时候都有办法,所以看看IRegisteredObject
也可以看看