Бесконечный, пока l oop при опросе данных из полученных байтов - PullRequest
0 голосов
/ 13 июля 2020
• 1000 NetworkTpdu имеет значение null, но это не так! While-l oop бесконечен ... Кто-нибудь есть идея?
int start = Environment.TickCount;
int myTimeout = 5000; 
while (NetworkTpdu.CreateFromBuffer(_receiveBuffer, false) == null && (!_masterMode || Environment.TickCount - start < myTimeout))
{
    _receiveBuffer.WaitForByte(myTimeout, false);
}

1 Ответ

2 голосов
/ 13 июля 2020

, вероятно, будет легче найти проблему, если вы разделите метод на отдельные операторы. Например:

        var sw = Stopwatch.StartNew();
        var timeout = TimeSpan.FromSeconds(5);
        while (true)
        {
            var buffer = NetworkTpdu.CreateFromBuffer(_receiveBuffer, false);
            if (buffer != null)
            {
                Console.WriteLine("Buffer is not null");
                return;
            }

            if (_masterMode)
            {
                if (sw.Elapsed > timeout)
                {
                    Console.WriteLine("Timeout!");
                    return;
                }
            }
            Console.WriteLine("Wait for byte: " + sw.ElapsedMilliseconds);
            _receiveBuffer.WaitForByte(timeout.TotalMilliseconds, false);
            // Check if WaitForByte succeeded or timed out, and handle the result
        }

Это должно упростить поиск проблемы:

  1. Ожидание, пока байт не печатается -> CreateFromBuffer никогда не возвращает
  2. Подождите Байт печатается только один раз -> WaitForByte никогда не возвращает
  3. Ожидание байта печатается со значением более 5000 -> _masterMode имеет значение false

Изменить: как canton7 упоминалось в комментариях, вы можно сделать то же самое с отладчиком, разместив точки останова или трассировки в соответствующих местах. Это просто способ сделать порядок выполнения более очевидным.

...