Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序启动时并发运行多个任务_C#_.net_Asp.net Mvc_Task Parallel Library - Fatal编程技术网

C# 在应用程序启动时并发运行多个任务

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

能有一个友好的灵魂指引我正确的方向吗

基本上,我想要实现的是在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);            
    }
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崩溃。恐怕这个问题没有灵丹妙药。