1

ユーザー入力に基づいて N 回ループするループ (以下) があります。ループは、データベースに挿入するテキストのランダム文字列を作成するメソッドを呼び出します。ループがクエリを実行する前にこのメソッドを呼び出すようにしたいので、データベースへの挿入ごとに異なるランダムな文字列が含まれます。

ループの実行が速すぎて、動的文字列変数が十分に速く更新されないため、ランダム文字列が約 50 回挿入されているようです。ただし、 をスローする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()別のスレッドを起動しない限り(その場合は、そのコードを表示)、次の 2 つのステートメントが実行される前に完了します。

名前が変わらない場合、問題は別の場所にあります。

ただし、thread.sleep(50) をスローすると、コードは完全に実行されます。

あなたが示したコードには、スレッドのスリープに敏感なものはありません。それが何らかの効果をもたらしている場合、問題rnd.RndName()は実装方法にあります。Randomおそらく、毎回の新しいインスタンスを作成していますか (@rynah のコメントで示唆されているように)。その場合、インスタンスはシステム時刻を使用して初期化されます。それはあなたが観察する行動を引き起こすでしょう。

このRandomクラスは実際には乱数を生成しません。指定されたシード値に対して決定論的な一連の数値を生成します。現在のティック数にシードする場合 (そうなると思いますRandom)、多くのRandomインスタンスを立て続けに作成すると、すべてのインスタンスが同じシードを持つため、まったく同じ一連の数字が生成されます。

于 2013-05-20T00:36:35.957 に答える