免责声明:我可能有个坏主意!
我在ASP.NET 5上有一个中间件。
此中间件处理请求并启动新的Task
。该任务主要用于统计目的。
中间件不关心此任务的结果。
出于性能原因,我想继续使用ASP.NET管道而不等待"背景"任务。
我看到实现这个的三种方法:
1 /开始任务,没有await
或.Wait()
。不关心未观察到的异常。
2 /在" observer
"中注册任务。观察者将观察所有任务,直到应用程序结束。
3 /使用服务总线和/或某种工作者角色/ WebJob。
我不喜欢解决方案1 /.
解决方案3 /似乎过度。
解决方案2 /对我来说是可以的,有类似的东西:
public class TaskObserver : IDisposable
{
private readonly List<Task> _tasks = new List<Task>();
public void RegisterTask(Task task)
{
_tasks.Add(task)
}
public void Dispose()
{
Task.WaitAll(_tasks.ToArray());
}
}
// somewhere in the service configuration...
serviceCollection.AddSingleton<TaskObserver>();
观察员将通过其容器在最终申请中处理。
我甚至可以定期添加Timer
来清理已完成的任务。
在ASP.NET 5上下文中,2 /解决方案是否正确?
答案 0 :(得分:2)
最重要的是,ASP.NET并非设计用于执行不 HTTP请求的工作。有一个few different ways to try to hack together a fire-and-forget situation(正如我在博客中描述的那样),但没有一个是万无一失的。
另一方面,WebJobs专为完全这种情况而设计。所以最好的答案是&#34;只需使用WebJobs&#34;。试一试;他们可能没有你想象的那么难。但是,如果你真的想在ASP.NET AppDomain中采用不太可靠的后台工作路线,那么有不同程度的黑客可以尝试。例如,如果您愿意依赖完整的.NET框架(而不仅仅是核心),那么您可以使用HostingEnvironment.QueueBackgroundWorkItem
。
答案 1 :(得分:0)
Hangfire(google Hangfire.io)现在具有ASP.NET核心支持,甚至可以处理异步任务,它专为此目的而构建。