火灾观察员和忘记任务

时间:2015-06-07 17:04:51

标签: asp.net-core

免责声明:我可能有个坏主意!

我在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 /解决方案是否正确?

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核心支持,甚至可以处理异步任务,它专为此目的而构建。