C# 轮询接收到的字节中的数据时出现无休止的while循环
我使用了一些我认为有效的第三方代码…这是一个循环,它使用ByteBuffer从接收到的套接字字节中轮询一些数据,并且在NetworkTpdu为空时必须对超时作出反应,但它没有!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
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
}
这样可以很容易地发现问题:
编辑:正如注释中提到的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
}
这样可以很容易地发现问题:
编辑:正如注释中提到的canton7,您可以通过在适当的位置放置断点或跟踪点来使用调试器执行相同的操作。这只是一种使执行顺序更加明显的方法。您调试过了吗?检查调试器中的条件
Environment.TickCount-start
,该条件何时超时?也许主模式是假的?也许WaitForByte
正在无限期地阻塞?Environment.TickCount是毫秒(int)并且'myTimeout'也应该在5秒钟内超时,我调试过了,您调试过了吗?检查调试器中的条件Environment.TickCount-start
,该条件何时超时?也许主模式是假的?也许WaitForByte
正在无限期地阻塞?Environment.TickCount是毫秒(int),而“myTimeout”也应该在5秒内超时,我对它进行了调试注意,您可以使用调试器执行完全相同的操作,而无需更改代码。但是,如果您不习惯使用调试器,这将是一种更好的方法,可以说明您可以使用调试器执行完全相同的操作,而无需更改代码。但是,如果您不习惯使用调试器,这将是一种更好的方法