C# 在应用程序启动时并发运行多个任务
能有一个友好的灵魂指引我正确的方向吗 基本上,我想要实现的是在web应用程序启动期间做一些工作。主要是热身活动和设置任务 这些任务彼此独立,不共享任何状态,因此我认为并发运行它们可能是个好主意 到目前为止,我提出的解决方案如下:C# 在应用程序启动时并发运行多个任务,c#,.net,asp.net-mvc,task-parallel-library,C#,.net,Asp.net Mvc,Task Parallel Library,能有一个友好的灵魂指引我正确的方向吗 基本上,我想要实现的是在web应用程序启动期间做一些工作。主要是热身活动和设置任务 这些任务彼此独立,不共享任何状态,因此我认为并发运行它们可能是个好主意 到目前为止,我提出的解决方案如下: public void Execute() { IEnumerable<IStartupTask> startupTasks = PrepareStartupTasks(); Task.Factory.Sta
public void Execute()
{
IEnumerable<IStartupTask> startupTasks = PrepareStartupTasks();
Task.Factory.StartNew(httpContext =>
{
HttpContext.Current = httpContext as HttpContext;
Parallel.ForEach(startupTasks, startupTask => startupTask.Execute());
}, HttpContext.Current);
}
public void Execute()
{
IEnumerable startupTasks=PrepareStartupTasks();
Task.Factory.StartNew(httpContext=>
{
HttpContext.Current=HttpContext作为HttpContext;
Parallel.ForEach(startupTasks,startupTask=>startupTask.Execute());
},HttpContext.Current);
}
我想要实现的是尽快在线程池线程上运行这个独立的工作,并完成预热
这是应用程序启动,因此我没有必要异步运行它们,尽管其中一些任务会执行一些i/O(主要是API调用)
这是在引导过程中剥离一些工作的好方法吗?这似乎是可行的,但我可能会错过一些潜在的陷阱,这就是为什么我在这里:)
提前谢谢
这是在引导过程中剥离一些工作的好方法吗
是的,但这些任务不应依赖于HttpContext.Current
,因为这在application\u Start
事件中不可用,而且有时您的代码可能会正常工作。因此,一旦您从应用程序\u Start
中摆脱了这个HttpContext
,您就没事了。永远不要在后台线程中编写依赖于HttpContext的代码。这永远不能保证存在。下面是一个例子,说明这可能会破坏。一个HTTP请求进入,您启动一个捕获当前上下文的后台任务。后台任务需要10秒钟。HTTP请求在5秒后完成执行,并向用户返回响应。因此,它被处理。在第10秒,您尝试在后台任务中使用此捕获(并在此时释放)的HttpContext。结果是一个很好的小例外
另外,我希望您知道,如果IIS重新启动AppDomain,您可能在ASP.NET应用程序中启动的所有后台任务都可能被撕碎(这基本上可以在您无法控制的情况下发生)。因此,如果您需要这些任务的耐用性,您应该考虑将它们从ASP.NET应用程序卸载到单独的服务中,例如,它可以是Windows服务,或者仅仅是一个普通控制台应用程序,它被安排在Windows调度程序以指定的时间间隔运行。服务,请使用执行此操作的现有库之一。看看这个帖子,谢谢!我知道AppDomain可以关闭,但这不是一个问题,因为这不是一些关键的、持久的操作。在这种情况下,只要AppDomain重新启动,就可以再次运行它们。我唯一的问题是其中一个任务在内部使用HttpContext并执行一些任务,我想知道如何处理它。如果它是后台任务,根据定义,它不应该依赖或绑定到任何HTTP上下文。如果是这样的话,我担心您可能做了一些非常错误的事情。不幸的是,代码不在我的所有权范围内,反编译我注意到它在内部使用了上下文。我可能会重新思考这个操作的本质,并将其从后台任务中移出。不幸的是,在这种情况下,我所能做的就是祝你们好运。只需确保将一些错误日志记录到后台任务中,以便您知道如何从已处理的HTTP上下文中手动恢复失败的任务。另外,捕获您将在后台线程中得到的未处理异常可能是一个好主意,以避免每次您运气不好并遇到已处理的HTTP上下文时,都会导致AppDomain崩溃。恐怕这个问题没有灵丹妙药。