【问题标题】:Visual C# very poor performance in while loopVisual C# 在 while 循环中的性能非常差
【发布时间】:2013-06-03 23:27:15
【问题描述】:

我在使用 C# 中的 while 循环时遇到了一些问题。假设每周发生一次。 我正在循环通过一个 SQL Server 数据阅读器,我阅读了简单的字符串、双精度数等......我不明白为什么会偶尔发生这种情况。如果我的代码有问题,那么它的性能应该总是很差。

更具体地说,发生这种情况时,当我设置断点时,线程会在 3 或 4 秒后中断。最奇怪的是,如果我按 F5 或者如果我“逐步”循环,它会花费更少的时间!

这真的很奇怪,让我发疯。

我想知道是否有人遇到过这种奇怪的交易。

提前感谢您的回复!

PS:while 循环由特定线程(不是主线程)执行。

PS 2:这是我的代码

reader = DBConnect.GetInstance.ExecuteReader(request.ToString(), out connection, timeOut);

while (reader.Read())
{
    SourceInst sourceInst = new SourceInst();
    sourceInst.Load(reader);
    sourceInstList.Add(sourceInst);
}

【问题讨论】:

  • 请出示代码。在不知道代码长什么样的情况下很难为您提供帮助。这很可能是暂时的网络问题,或者数据库繁忙等。
  • 这个问题更有可能与您的 SQL Server 数据库有关,而不是您的 C# 代码,但根据您发布的信息,我们只能猜测。
  • 你怎么知道它的 foreach 块运行缓慢?你确定你的线程是同步的吗?
  • 正如@recursive 所说,如果您通过网络循环访问 SQL 数据,显然您会遇到数据库或网络的间歇性性能不佳。
  • 这和多线程有什么关系?我的意思是,代码中没有任何内容表明多线程是负责任的......

标签: c# multithreading performance while-loop


【解决方案1】:

您的数据库性能可能会有所不同,从而导致您的问题。 @987654321@ 为您的数据库提供流,并且不在内存中缓冲。您对“查询在循环之前执行”的假设是不正确的。流保持打开状态,您正在使用此循环通过游标从数据源一次读取一条记录。因此,随着您的数据库性能波动,您的循环性能也会波动。它不会在循环之前将所有记录加载和缓冲到内存中 - 如果您愿意,您可以这样做,但我不建议在内存使用方面这样做。

【讨论】:

  • “查询在循环之前执行”的假设确实是不正确的,而且如此雄心勃勃:-)。感谢您的回复@DavidH。有关SqlDataReader here 的更多信息。
猜你喜欢
  • 2010-11-13
  • 2020-09-04
  • 2021-05-29
  • 2012-05-21
  • 1970-01-01
  • 2014-01-11
  • 2015-05-14
  • 2017-01-22
相关资源
最近更新 更多