2012-03-07 160 views
0

這部分代碼給出了一個客戶端,它通過檢查ID是否已被使用或未被使用,然後檢查下一個最高ID來連接到服務器的ID。出於某種原因,這導致了一個永無止境的循環,爲什麼呢?爲什麼這會導致inf。循環?

 int IDcounter = 0; 
     bool IDfound = false; 
     bool IDused = false; 
     while (!IDfound) 
     { 
      Console.WriteLine("Current ID check " + IDcounter); 
      Console.WriteLine("Number of clients " + clientList.Count); 
      foreach (Client id in clientList) 
      { 
       if (id.ID == IDcounter) 
       { 
        IDused = true; 
        IDcounter++; 
        break; 
       } 
      } 
      if (!IDused) 
      { 
       client.ID = IDcounter; 
       IDfound = true; 

      } 

     } 

     clientList.Add(client); 
+0

「IDcounter」分配在哪裏? – 2012-03-07 22:13:05

+0

對不起,對於IDfound,編輯錯誤 – user1255805 2012-03-07 22:13:51

+2

如果這是分配一個標識符用作數據庫密鑰,這不是一個好主意。 – 2012-03-07 22:17:00

回答

6

你需要一個else添加到最終if聲明:

 if (!IDused) 
     { 
      client.ID = IDcounter; 
      IDfound = true; 

     } 
     else 
     { 
      // Reset the IDUsed status 
      IDUsed = false; 
     } 

考慮一下,當你發現你檢查的第一個ID是採取一些客戶會發生什麼。您將IDUsed設置爲true,然後設置break循環。 if (!IDUsed)檢查是錯誤的(因爲ID 使用了),因此您重複。但請注意,您從未將IDUsed設置回false。事實上,在循環中沒有任何事情發生,所以你永遠循環。

+0

+1雖然我認爲你的意思是'IDused'而不是'IDUser' – 2012-03-07 22:18:36

+0

@ M.Babcock Yep,編輯。 – dlev 2012-03-07 22:19:56

+0

Omg我覺得自己像一個白癡大聲笑,謝謝你的幫助生病接受4分鐘後的答案 – user1255805 2012-03-07 22:22:53

0

如果你沒有找到id,那麼你只有擺脫你的循環。如果你確實找到了id,那麼IDused是真實的,IDFound保持不真實。

1

您忘記將Idused = false設置爲循環

相關問題