簡體   English   中英

雖然循環產生不正確的結果,但在C#程序中沒有斷點

[英]While loop produce incorrect results with no breakpoints in C# program

我在下面的代碼中遇到了奇怪的問題,當我從while循環中排除斷點時,結果是不同的。

foreach循環遍歷列表中的20個項目,並將每個項目添加到字典中。

當我在循環中添加斷點並跳過20次時,會添加20個項目。

如果我刪除所有斷點並運行程序,則只添加1個項目。

public void AddLinks(Dictionary<Guid,string> RowKeyTitles)
{
    var combinedUrlsList = new Dictionary<string, string>();

    var urlTemplate = ConfigurationManager.AppSettings["playlisturl"];
    var count = 0;

    foreach (var row in RowKeyTitles)
    {
        var shortUrl = StringGenerator.GenerateShortLink(4);
        var combinedUrl = urlTemplate.Replace("{name}", row.Value).Replace("{id}",row.Key.ToString());

        while (!combinedUrlsList.ContainsKey(shortUrl))
        {
            Console.WriteLine("test");

            shortUrl = StringGenerator.GenerateShortLink(4);

            if (!combinedUrlsList.ContainsKey(shortUrl))
            {
                count++; 
                Console.WriteLine("Added{0}", count);
                combinedUrlsList.Add(shortUrl, combinedUrl);

            }
        }              
    }

    Console.WriteLine("Count{0}",combinedUrlsList.Count());
    Console.ReadLine();
}

有誰知道可能導致這種行為的原因是什么?

我會猜測並說出StringGenerator.GenerateShortLink(4); 在緊密循環中生成相同的shortUrl 這很可能是你在循環中創建一個新的Random類。

破解代碼的一個例子

while(.....)
{
    Random rnd = new Random();
    rnd.Next();
}

這將產生許多same數字,因為Random()使用系統時間作為種子。

修理。 Random聲明為您的類的私有字段並僅創建一次。

給出的信息唯一可能的解釋是StringGenerator.GenerateShortLink以“timinig-sensitive”的方式實現 - 例如,如果它在內部使用Random實例並在每次調用時重新創建它......在這種情況下新創建的實例(默認情況下)使用當前系統時間進行初始化...使用斷點,它會延遲到產生不同的隨機數...沒有斷點,它會被相同的數字初始化(因為沒有足夠的延遲)並因此產生相同的隨機數(S)這反過來又產生相同shortUrl它已經產生的第一次...,因為這已經是字典的一部分combinedUrlsList它只是將不會被添加的第二時間...

修復上述行為:
不要在調用之間重新創建StringGenerator.GenerateShortLink使用的Random實例,而是在后續調用中重用已創建的實例...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM