[英]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.