运行 在 Application_Start 上同时执行多个任务
Running multiple Tasks concurrently on Application_Start
哪位好心人能给我指出正确的方向吗?
基本上我想要实现的是在 Web 应用程序启动期间做一些工作。主要是热身活动和设置任务。
这些任务彼此独立,它们不共享任何状态,所以我认为 运行 同时执行它们可能是个好主意。
到目前为止我得到的解决方案如下:
public void Execute()
{
IEnumerable<IStartupTask> startupTasks = PrepareStartupTasks();
Task.Factory.StartNew(httpContext =>
{
HttpContext.Current = httpContext as HttpContext;
Parallel.ForEach(startupTasks, startupTask => startupTask.Execute());
}, HttpContext.Current);
}
我想实现的是运行这个独立工作尽快在线程池线程上完成预热。
这是应用程序启动,所以我没有必要异步 运行 它们,尽管其中一些任务执行一些 I/O(主要是 API 调用)。
这是在 bootstrap 期间分拆一些工作的好方法吗?似乎可行,但我可能会错过一些潜在的陷阱,这就是我来这里的原因:)
提前致谢
Is this a good approach to spin off some work during the bootstrap?
是的,但这些任务不应依赖于 HttpContext.Current
,因为这在 Applicastion_Start
事件中不可用,有时您的代码可以正常工作。因此,一旦您从 Application_Start
中删除此 HttpContext
,您就会没事的。永远不要在后台线程中编写依赖于 HttpContext 的代码。这永远不会保证存在。这是一个如何破坏的示例。收到一个 HTTP 请求,您启动一个后台任务来捕获当前上下文。后台任务需要 10 秒。 HTTP 请求在 5 秒后执行完毕并向用户返回响应。因此它被处理掉了。在第 10 秒,您尝试在后台任务中使用这个捕获的(并在那时被处置)HttpContext。结果是一个不错的小例外。
我还希望您知道,如果 AppDomain 由 IIS 重新启动,您可能在 ASP.NET 应用程序中启动的所有后台任务都可能被撕成碎片(这基本上可能发生在未启动的情况下)在你的控制之下)。因此,如果您需要这些任务的持久性,您绝对应该考虑将它们从您的 ASP.NET 应用程序卸载到一个单独的服务中——例如,可以是一个 Windows 服务,或者只是一个计划到 运行 由 Windows 调度程序按指定的时间间隔执行。
哪位好心人能给我指出正确的方向吗?
基本上我想要实现的是在 Web 应用程序启动期间做一些工作。主要是热身活动和设置任务。
这些任务彼此独立,它们不共享任何状态,所以我认为 运行 同时执行它们可能是个好主意。
到目前为止我得到的解决方案如下:
public void Execute()
{
IEnumerable<IStartupTask> startupTasks = PrepareStartupTasks();
Task.Factory.StartNew(httpContext =>
{
HttpContext.Current = httpContext as HttpContext;
Parallel.ForEach(startupTasks, startupTask => startupTask.Execute());
}, HttpContext.Current);
}
我想实现的是运行这个独立工作尽快在线程池线程上完成预热。
这是应用程序启动,所以我没有必要异步 运行 它们,尽管其中一些任务执行一些 I/O(主要是 API 调用)。
这是在 bootstrap 期间分拆一些工作的好方法吗?似乎可行,但我可能会错过一些潜在的陷阱,这就是我来这里的原因:)
提前致谢
Is this a good approach to spin off some work during the bootstrap?
是的,但这些任务不应依赖于 HttpContext.Current
,因为这在 Applicastion_Start
事件中不可用,有时您的代码可以正常工作。因此,一旦您从 Application_Start
中删除此 HttpContext
,您就会没事的。永远不要在后台线程中编写依赖于 HttpContext 的代码。这永远不会保证存在。这是一个如何破坏的示例。收到一个 HTTP 请求,您启动一个后台任务来捕获当前上下文。后台任务需要 10 秒。 HTTP 请求在 5 秒后执行完毕并向用户返回响应。因此它被处理掉了。在第 10 秒,您尝试在后台任务中使用这个捕获的(并在那时被处置)HttpContext。结果是一个不错的小例外。
我还希望您知道,如果 AppDomain 由 IIS 重新启动,您可能在 ASP.NET 应用程序中启动的所有后台任务都可能被撕成碎片(这基本上可能发生在未启动的情况下)在你的控制之下)。因此,如果您需要这些任务的持久性,您绝对应该考虑将它们从您的 ASP.NET 应用程序卸载到一个单独的服务中——例如,可以是一个 Windows 服务,或者只是一个计划到 运行 由 Windows 调度程序按指定的时间间隔执行。