我有一个循环(下面)根据用户输入循环N次。循环,调用一个方法,为插入数据库创建一个随机的文本字符串。我希望循环在执行查询之前调用此方法,因此每次插入数据库时都会有一个不同的随机字符串。
似乎正在发生的是,循环运行得太快,并且随机字符串被插入大约50次,因为动态字符串变量没有足够快地更新。但是,如果我输入Thread.Sleep(50)
,代码就会完美执行。
我不喜欢thread.sleep选项,因为我不知道它需要睡多长时间,如果我们开始运行几十万个事务,这个时间就会加起来。有没有人有一个很好的解决方案来确保方法在继续之前完全执行?
for (int i = 0; i < nLoop; i++)
{
rnd.RndName();
query.CommandText = "insert into XXX (col";
query.ExecuteNonQuery();
}
答案 0 :(得分:5)
似乎正在发生的是,循环运行得太快,并且随机字符串被插入大约50次,因为动态字符串变量没有足够快地更新。
循环中的指令将一个接一个地执行。
除非rnd.RndName()
激活一个单独的线程(在这种情况下,显示该代码),否则它将在执行以下两个语句之前完成。
如果名称没有改变,问题出在其他地方。
但是,如果我抛出thread.sleep(50),代码就会完美执行。
您显示的代码中没有任何内容对线程睡眠敏感。如果这有一些影响,问题在于如何实现rnd.RndName()
。也许你每次都在创建Random
的新实例(正如@rynah的评论中所建议的那样)?如果是,则使用系统时间初始化实例。这会导致你观察到的行为。
Random
类并不真正生成随机数。它为给定的种子值生成确定的一系列数字。如果您接近当前的刻度数(我认为Random
确实如此),快速连续创建许多Random
个实例将导致它们都具有相同的种子,因此产生完全相同的序列数字。