2015-06-07 59 views
1

免责声明:我可能有一个坏主意!观察员为火&忘记任务

我在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清理已完成的任务。

2 /解决方案在ASP.NET 5上下文中是否正确?

+0

更新:[在使用IHostedService和BackgroundService类的.NET Core 2.x webapps或微服务中实现后台任务](https://blogs.msdn.microsoft.com/cesardelatorre/2017/11/18/implementing-background -tasks-in-microservices -with-ihostedservice-and-the-backgroundservice-class-net-core-2-x /) –

回答

2

底线是,ASP.NET并没有设计用于执行而不是的HTTP请求。有一个few different ways to try to hack together a fire-and-forget situation(正如我在我的博客中描述的),但它们都不是万无一失的。

另一方面,WebJobs专门为设计,这个场景恰好为。所以最好的答案是“只使用WebJobs”。给他们一个尝试;他们可能不像你想象的那么难。但是,如果您确实想在ASP.NET AppDomain中采用不太可靠的后台工作路线,那么可以尝试不同程度的黑客攻击。例如,如果你愿意依赖完整的.NET框架(不仅仅是核心),那么你可以使用HostingEnvironment.QueueBackgroundWorkItem

+1

我认为你是正确的(一如既往!),只是'HostingEnvironment.QueueBackgroundWorkItem'不包含在ASP.NET 5中。由于托管环境本身发生了很大变化,作为后台线程的任务问题是否也会发生变化? –

+1

我不建议在您的网络应用程序中添加后台任务。原因是如果您的网站暂时没有请求,您的网站可以关闭。像斯蒂芬说的那样,使用webjobs或其他服务来做后台处理。 –

+1

@MattDeKrey:我希望QBWI一旦发布,就会包含在'dnx452' /'dnx46'中。 AFAIK没有计划把它放在'dnxcore'中。 –

0

Hangfire(google Hangfire.io)现在拥有ASP.NET核心支持,甚至可以与异步任务一起工作,它专门为此目的而构建。

+1

他们拥有永久许可证版本:https://www.hangfire.io/pricing/ –

+0

看到“每个开发人员/年”但错过永久。非常有前途! – TamusJRoyce