1

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

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

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

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

1 回答 1

5

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

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

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

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

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

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

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

于 2013-05-20T00:36:35.957 回答