Asp.net core 消防处观察员;忘记任务
免责声明:我可能有个坏主意 我在ASP.NET5上有一个中间件。 此中间件处理请求并启动新的Asp.net core 消防处观察员;忘记任务,asp.net-core,Asp.net Core,免责声明:我可能有个坏主意 我在ASP.NET5上有一个中间件。 此中间件处理请求并启动新的任务。这项任务主要用于统计目的。 中间件不关心此任务的结果 出于性能原因,我想继续ASP.NET管道,而不必等待“后台”任务 我认为有三种方法可以实现这一点: 1/启动任务,无Wait或.Wait()。不要关心未观察到的异常 2/在“观察者”中注册任务。观察者将观察所有任务,直到应用程序结束 3/使用服务总线和/或某种工作者角色/WebJob 我不喜欢这个解决方案 解决办法似乎太过分了 解决方案2/对我来
任务
。这项任务主要用于统计目的。
中间件不关心此任务的结果
出于性能原因,我想继续ASP.NET管道,而不必等待“后台”任务
我认为有三种方法可以实现这一点:
1/启动任务,无Wait
或.Wait()
。不要关心未观察到的异常
2/在“观察者
”中注册任务。观察者将观察所有任务,直到应用程序结束
3/使用服务总线和/或某种工作者角色/WebJob
我不喜欢这个解决方案
解决办法似乎太过分了
解决方案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>();
公共类TaskObserver:IDisposable
{
私有只读列表_tasks=new List();
公共无效注册表任务(任务)
{
_任务。添加(任务)
}
公共空间处置()
{
Task.WaitAll(_tasks.ToArray());
}
}
//在服务配置中的某个位置。。。
serviceCollection.AddSingleton();
观察者将在应用程序结束时通过其容器进行处理。
我甚至可以添加一个计时器
,定期清理已完成的任务
2/解决方案在ASP.NET 5上下文中是否正确?底线是ASP.NET不是为执行非HTTP请求的工作而设计的。有一种方法(正如我在博客上描述的),但没有一种是万无一失的 另一方面,WebJobs正是为这种情况而设计的。所以最好的答案是“只使用WebJobs”。试试看;它们可能没有你想象的那么难
但是,如果您真的想在ASP.NET AppDomain中采用不太可靠的方式进行后台工作,那么可以尝试不同程度的黑客攻击。例如,如果您愿意依赖完整的.NET框架(不仅仅是核心),那么您可以使用
HostingEnvironment.QueueBackgroundWorkItem
Hangfire(google Hangfire.io)现在支持ASP.NET核心,甚至可以处理异步任务,它正是为此目的而构建的 我认为你是对的(一如既往!),除了ASP.NET 5中不包括HostingEnvironment.QueueBackgroundWorkItem
。由于托管环境本身已经发生了实质性的变化,作为后台线程的任务问题也可能发生了变化吗?我不建议在web应用程序中添加后台任务。原因是,如果暂时没有请求,您的网站可能会关闭。正如Stephen所说,使用webjobs或其他进行后台处理的服务。@MattDeKrey:我希望QBWI在发布后将包含在dnx452
/dnx46
中。如果没有计划将其放入dnxcore
。HostingEnvironment.QueueBackgroundWorkItem在ASP.NET 5中不可用,请不要尝试使用它。System.Web不存在,所以它可能会做意想不到的事情,或者干脆爆炸。WebJobs是Azure唯一的功能吗?看到了“每个开发者/年”,但错过了“永久”。非常有前途!更新: