Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 轮询接收到的字节中的数据时出现无休止的while循环_C#_Sockets_While Loop - Fatal编程技术网

C# 轮询接收到的字节中的数据时出现无休止的while循环

C# 轮询接收到的字节中的数据时出现无休止的while循环,c#,sockets,while-loop,C#,Sockets,While Loop,我使用了一些我认为有效的第三方代码…这是一个循环,它使用ByteBuffer从接收到的套接字字节中轮询一些数据,并且在NetworkTpdu为空时必须对超时作出反应,但它没有!while循环是无止境的…有人有主意吗 int start = Environment.TickCount; int myTimeout = 5000; while (NetworkTpdu.CreateFromBuffer(_receiveBuffer, false) == null && (!_mas

我使用了一些我认为有效的第三方代码…这是一个循环,它使用ByteBuffer从接收到的套接字字节中轮询一些数据,并且在NetworkTpdu为空时必须对超时作出反应,但它没有!while循环是无止境的…有人有主意吗

int start = Environment.TickCount;
int myTimeout = 5000; 
while (NetworkTpdu.CreateFromBuffer(_receiveBuffer, false) == null && (!_masterMode || Environment.TickCount - start < myTimeout))
{
    _receiveBuffer.WaitForByte(myTimeout, false);
}
int start=Environment.TickCount;
int myTimeout=5000;
while(NetworkTpdu.CreateFromBuffer(_receiveBuffer,false)=null&(!_masterMode | | Environment.TickCount-开始
如果将方法拆分为单独的语句,可能会更容易找到问题。例如:

        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
        }
这样可以很容易地发现问题:

  • 等待字节未打印->CreateFromBuffer永不返回
  • 等待字节只打印一次->等待字节永不返回
  • 等待字节打印值超过5000->\u主模式为假

  • 编辑:正如注释中提到的canton7,您可以通过在适当的位置放置断点或跟踪点来使用调试器执行相同的操作。这只是一种使执行顺序更加明显的方法。

    如果将方法拆分为单独的语句,可能会更容易找到问题。例如:

            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
            }
    
    这样可以很容易地发现问题:

  • 等待字节未打印->CreateFromBuffer永不返回
  • 等待字节只打印一次->等待字节永不返回
  • 等待字节打印值超过5000->\u主模式为假

  • 编辑:正如注释中提到的canton7,您可以通过在适当的位置放置断点或跟踪点来使用调试器执行相同的操作。这只是一种使执行顺序更加明显的方法。

    您调试过了吗?检查调试器中的条件
    Environment.TickCount-start
    ,该条件何时超时?也许主模式是假的?也许
    WaitForByte
    正在无限期地阻塞?Environment.TickCount是毫秒(int)并且'myTimeout'也应该在5秒钟内超时,我调试过了,您调试过了吗?检查调试器中的条件
    Environment.TickCount-start
    ,该条件何时超时?也许主模式是假的?也许
    WaitForByte
    正在无限期地阻塞?Environment.TickCount是毫秒(int),而“myTimeout”也应该在5秒内超时,我对它进行了调试注意,您可以使用调试器执行完全相同的操作,而无需更改代码。但是,如果您不习惯使用调试器,这将是一种更好的方法,可以说明您可以使用调试器执行完全相同的操作,而无需更改代码。但是,如果您不习惯使用调试器,这将是一种更好的方法