Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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# 为什么我的foreach循环在ASP.NET MVC视图中如此缓慢?_C#_Asp.net Mvc - Fatal编程技术网

C# 为什么我的foreach循环在ASP.NET MVC视图中如此缓慢?

C# 为什么我的foreach循环在ASP.NET MVC视图中如此缓慢?,c#,asp.net-mvc,C#,Asp.net Mvc,我在视图中使用foreach循环我的强类型模型并显示一个表。只有25行7列,大约需要280毫秒。这似乎很慢。在视图中使用循环有什么性能技巧吗 编辑:我的控制器从Azure表中获取数据,并使用ViewModel模式将其提供给视图。我不知道这是否重要,但我的视图是用VB编写的,模型是用C#编写的。所以,他们在不同的项目中。我会提出一个精简的例子来发布,但我现在已经快出门了,必须在今晚晚些时候进行讨论。我希望我能在人们周末回家之前赶上StackOverflow的人群,所以我的原始帖子很快就被制作出来了

我在视图中使用
foreach
循环我的强类型模型并显示一个表。只有25行7列,大约需要280毫秒。这似乎很慢。在视图中使用循环有什么性能技巧吗

编辑:我的控制器从Azure表中获取数据,并使用ViewModel模式将其提供给视图。我不知道这是否重要,但我的视图是用VB编写的,模型是用C#编写的。所以,他们在不同的项目中。我会提出一个精简的例子来发布,但我现在已经快出门了,必须在今晚晚些时候进行讨论。我希望我能在人们周末回家之前赶上StackOverflow的人群,所以我的原始帖子很快就被制作出来了,没有示例代码

编辑:我和Fiddler确认没有延迟加载发生。在渲染视图期间没有小提琴手活动

编辑:如果我从Azure表向视图提供数据,则需要280毫秒。如果我向同一个视图提供与Azure表中的真实数据相似的假数据,则需要60毫秒。在这两种情况下,控制器只是填充ViewModel对象并将其传递给视图。两个实例中使用相同的ViewModel类。我不明白

编辑:我想我明白了。如果我一开始就包含代码的话,这对其他人来说可能是显而易见的。以下是我的ViewModel:

public class EmployeeChildrenViewModel
{
    public Employee employee;
    public IEnumerable<Child> children;
}
公共类EmployeeChildrenViewModel
{
公共雇员;
公共教育:可数儿童;
}

如果我将上述ViewModel传递给我的视图,
foreach
需要280毫秒。如果我先用
children.ToList()
填充上面的ViewModel,那么视图只需要60毫秒。然而,经过进一步的调查,我发现在这两种情况下,总的页面加载时间是相同的。我想在我的控制器或视图中迭代IEnumerable并不重要,因为总体效果是相同的。我仍然不确定迭代
子对象的作用,因为我确信它不会在那一点上访问数据库,正如Fiddler所确认的那样。

获取.NET 4.0测试版和VS 2010测试版,并使用

Parallel.Foreach()

编辑:上面的答案应该有点讽刺意味。虽然这不是一个真正的解决方案,但一旦你在VS 2010中收获了第三方物流的好处,你就会明白我的意思了


实际上,你在循环什么,以及你在循环中到底在做什么,这实际上取决于你的代码结构、数据结构等。需要更多的信息来获得比上述更少讽刺的答案。

获取.NET 4.0测试版和VS 2010测试版,并使用

Parallel.Foreach()

编辑:上面的答案应该有点讽刺意味。虽然这不是一个真正的解决方案,但一旦你在VS 2010中收获了第三方物流的好处,你就会明白我的意思了


实际上,你在循环什么,以及你在循环中做什么,这实际上取决于你的代码结构、数据结构等。需要更多的信息,才能得到比上述更少讽刺的答案。

这真的只发生在视图中吗?也许在迭代过程中,执行数据库加载会减慢整个过程。您是否实现了某种延迟加载?您应该在这个过程中检查数据库活动。

它真的只在视图中发生吗?也许在迭代过程中,执行数据库加载会减慢整个过程。您是否实现了某种延迟加载?您应该在该过程中检查数据库活动。

您是使用Linq to SQL还是默认情况下延迟加载的其他ORM

我建议记录所有数据库调用(
datacontext.Log
=从
TextWriter
继承的某个类),并检查在视图中迭代关联时是否延迟加载关联

编辑:下面的信息似乎与此问题无关,但我将其留在这里,因为它可能对某些人有用:

假设您在这里使用Linq to SQL(如果不是这种情况,我将对此进行编辑):

当您的模型foo有一个关联栏(so foo.Bar),并且您没有在datacontext中指定任何LoadOptions时,该栏将被延迟加载(因此:调用时加载,就像在视图中可能发生的情况一样),这意味着视图基本上进入数据库。每行都会发生这种情况

执行以下操作:

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Foo>(f => f.Bar);
context.LoadOptions = options;

当延迟加载某些关联时,视图现在将生成异常,因为DataContext现在将被释放,并且不可用于数据库操作。

您使用的是Linq to SQL还是默认情况下延迟加载的其他ORM

我建议记录所有数据库调用(
datacontext.Log
=从
TextWriter
继承的某个类),并检查在视图中迭代关联时是否延迟加载关联

编辑:下面的信息似乎与此问题无关,但我将其留在这里,因为它可能对某些人有用:

假设您在这里使用Linq to SQL(如果不是这种情况,我将对此进行编辑):

当您的模型foo有一个关联栏(so foo.Bar),并且您没有在datacontext中指定任何LoadOptions时,该栏将被延迟加载(因此:调用时加载,就像在视图中可能发生的情况一样),这意味着视图基本上进入数据库。每行都会发生这种情况

执行以下操作:

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Foo>(f => f.Bar);
context.LoadOptions = options;

当延迟加载某些关联时,您的视图将生成异常,因为DataContext现在将被释放,并且不可用于数据库操作。

告诉我们您正在循环什么,可能是一些很重的内容,而您没有意识到。你还没有告诉我们关于这个问题的信息。@eu-ge-ne&@Karl:对不起,我应该先告诉你的。代码现在发布。告诉我们你在循环什么,也许是