【问题标题】:Loop runs too fast?循环运行太快?
【发布时间】:2013-05-20 00:33:15
【问题描述】:

我有一个循环(如下),它根据用户输入循环 N 次。该循环调用一个方法,该方法为插入数据库创建随机文本字符串。我希望循环在执行查询之前调用此方法,因此每次插入数据库都有不同的随机字符串。

似乎正在发生的事情是循环运行得太快,并且随机字符串插入了大约 50 次,因为动态字符串变量的更新速度不够快。但是,如果我输入Thread.Sleep(50),代码就会完美执行。

我不喜欢 thread.sleep 选项,因为我不知道它需要休眠多长时间,如果我们开始运行几十万个事务,这个时间就会加起来。有没有人有一个好的解决方案来确保该方法在继续之前完全执行?

for (int i = 0; i < nLoop; i++)
{
    rnd.RndName();
    query.CommandText = "insert into XXX (col";
    query.ExecuteNonQuery();
}

【问题讨论】:

  • 使用While Loop 并检查该值是否在数据库中,如果存在则继续?
  • rnd.RndName() 是否每次都创建一个新的Random 对象?如果是这样,请不要这样做。
  • rnd 是什么类型?向我们展示RndName 的代码。
  • 你用随机字符串做什么?如果只是为了获取一些独特的信息,您应该考虑为此使用 GUID (Guid.NewGuid()) 以避免 Random 出现问题
  • @ArveSystad:GUID 有一些固有的结构,即使许多位实际上是随机的。请参阅以下内容并注意分配给某些位位置的含义:en.wikipedia.org/wiki/Globally_unique_identifier

标签: c# loops


【解决方案1】:

似乎正在发生的事情是,循环运行得太快了,随机字符串插入了大约 50 次,因为动态字符串变量的更新速度不够快。

循环中的指令将一个接一个地执行。

除非rnd.RndName() 启动一个单独的线程(在这种情况下,显示该代码),否则它将在以下两个语句执行之前完成。

如果名称没有改变,则问题出在其他地方。

但是,如果我抛出一个 thread.sleep(50),代码会完美执行。

您显示的代码中的任何内容都不会对线程睡眠敏感。如果这有一些影响,那么问题就在于rnd.RndName() 是如何实现的。也许您每次都在创建一个Random 的新实例(正如@rynah 的评论中所建议的那样)?如果是这样,则使用系统时间初始化实例。这会导致您观察到的行为。

Random 类不会真正生成随机数。它为给定的种子值生成一系列确定的数字。如果您播种到当前的刻度数(我相信Random 确实如此),快速连续创建许多Random 实例将导致它们都具有相同的种子,因此产生完全相同的数字序列。

【讨论】:

  • @rynah 是正确的。我错误地让 rnd.RndName 方法每次都创建一个新的 Random 对象。问题解决了。谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多