我的代码中有一部分:
private void Wait(String expectedResponse)
{
waitTimeout = 30;
Stopwatch sw = new Stopwatch();
sw.Start();
while (!inputBuffer.Contains(expectedResponse))
{
if (sw.Elapsed.Seconds < waitTimeout)
{
Thread.Sleep(1);
}
else
{
sw.Stop();
throw new Exception("Timeout");
}
}
sw.Stop();
Console.WriteLine("SUCCESS");
}等待方法在主线程中运行,有时在创建主线程的线程中运行。
有时,程序的方法会无限循环,尽管时间(30秒)已经过去,而且异常不会产生。
那么,有什么问题?StopWatch类不是线程安全吗?如果是的话,如何重写代码呢?
有什么想法吗?
谢谢!
发布于 2015-09-24 04:41:10
来自MSDN
螺纹安全 任何这种类型的公共静态成员都是线程安全的。不保证任何实例成员都是线程安全的。
而且,我在您的代码中没有看到任何线程敏感的调用/方法。您正在实例化线程本地Stopwatch并使用它。顺便说一句,Thread.Sleep(1)将尝试阻塞1ms (但这是操作系统特有的,windows将阻塞15 is ),线程仍然没有问题。
现在我认为您的inputBuffer有一个问题,因为它不是线程本地的。如果多个线程同时尝试使用它,这将导致不一致。您可以尝试Stream.Synchronized或实现您自己的线程安全流类。
我还建议您使用逐步调试或至少使用一些断点来了解正在发生的事情。
https://stackoverflow.com/questions/32753407
复制相似问题