テスト目的で、サービスの 1 つにシミュレートされたデータを生成するアプリケーションがあります。各データ項目には一意の Guid があります。ただし、シミュレーターにいくつかの小さなコード変更を加えた後にテストを実行すると、シミュレーターによって生成されたすべてのオブジェクトが同じ Guid を持っていました。
単一のデータ オブジェクトが作成された後、新しい一意の Guid を含むオブジェクトのプロパティが変更された for ループがあり、リモート処理 (参照によるマーシャルではなくシリアル化可能) を介してサービスに送信されました。考えている)、ループしてもう一度やり直すなど。
小さな Thread.Sleep( ...) をループ内に配置すると、一意の ID が生成されます。私はそれが赤いニシンだと思います。次々と guid を作成しただけのテスト アプリを作成し、単一の重複を取得しませんでした。
私の理論は、IL がこの動作を引き起こす方法で最適化されたというものです。しかし、私の理論については十分です。どう思いますか?私はそれをテストするための提案と方法を受け入れます。
更新: 私の質問には多くの混乱があるようですので、明確にさせてください。NewGuid() が壊れているとは思いません。明らかにそれは機能します。大丈夫だよ!ただし、どこかにバグがあり、それにより NewGuid() が次のいずれかになります: 1) ループ内で 1 回だけ呼び出される 2) ループ内で毎回呼び出されるが、1 回だけ割り当てられる 3) 考えもしなかった何か
このバグは、私のコード (ほとんどの場合) または最適化のどこかにある可能性があります。
私の質問を繰り返しますが、このシナリオをどのようにデバッグすればよいですか?
(そして素晴らしい議論をありがとう、これは私の頭の中の問題を明確にするのに本当に役立っています)
更新#2:問題を示す例を投稿したいのですが、それは私の問題の一部です。アプリケーションスイート全体(クライアントとサーバー)の外で複製することはできません。
ただし、関連するスニペットは次のとおりです。
OrderTicket ticket = new OrderTicket(... );
for( int i = 0; i < _numOrders; i++ )
{
ticket.CacheId = Guid.NewGuid();
Submit( ticket ); // note that this simply makes a remoting call
}