почему это вызывает инф. цикл? - PullRequest
0 голосов
/ 08 марта 2012

Эта часть кода дает клиенту, который подключается к серверу, идентификатор, проверяя, использовался ли идентификатор, или нет, если он был установлен, то проверьте следующий наибольший идентификатор. По какой-то причине это вызывает бесконечный цикл. Почему?

        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);

Ответы [ 3 ]

6 голосов
/ 08 марта 2012

Вам необходимо добавить else в окончательный оператор if:

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

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

Подумайте, что происходит, когда вы обнаружите, что первый проверенный вами идентификатор получен каким-то клиентом. Вы устанавливаете IDUsed на true, а затем break цикл. Проверка if (!IDUsed) является ложной (поскольку использовался идентификатор ), и поэтому вы повторяете. Но обратите внимание, что вы никогда не устанавливали IDUsed обратно на false. И на самом деле, нигде в цикле не происходит, и поэтому вы зацикливаетесь вечно.

1 голос
/ 08 марта 2012

Вы забыли установить Idused = false внутри цикла

0 голосов
/ 08 марта 2012

Вы выходите из своей петли, только если не можете найти идентификатор. Если вы нашли идентификатор, то IDused - это истина, а IDFound - ложь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...