秒表是线程安全的吗?
Is the stopwatch thread-safe?
我的代码有一部分:
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");
}
Wait 方法在主线程中运行,有时在创建主线程的线程中运行。
而且有时程序的方法会无限循环,虽然时间(30秒)过去了,但并没有产生异常。
所以,有什么问题吗? StopWatch class 不是线程安全的?如果是这样,如何重写代码?
有什么想法吗?
谢谢!
来自MSDN:
Thread Safety
Any public static members of this type are thread safe. Any instance
members are not guaranteed to be thread safe.
此外,我在您的代码中没有看到任何线程敏感 call/method。您正在实例化线程局部 Stopwatch
并使用它。顺便说一句,Thread.Sleep(1)
将尝试阻塞 1 毫秒(但这是 OS 特定的,windows 将阻塞约 15 毫秒)并且线程仍然没有问题。
现在我认为您的 inputBuffer
有问题,因为它不是线程本地的。如果不止一个线程试图同时使用它,那将导致不一致。您可以尝试 Stream.Synchronized 或实现您自己的线程安全流 class.
我还建议您使用逐步调试或至少使用一些断点来了解发生了什么。
我的代码有一部分:
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");
}
Wait 方法在主线程中运行,有时在创建主线程的线程中运行。
而且有时程序的方法会无限循环,虽然时间(30秒)过去了,但并没有产生异常。
所以,有什么问题吗? StopWatch class 不是线程安全的?如果是这样,如何重写代码?
有什么想法吗?
谢谢!
来自MSDN:
Thread Safety
Any public static members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
此外,我在您的代码中没有看到任何线程敏感 call/method。您正在实例化线程局部 Stopwatch
并使用它。顺便说一句,Thread.Sleep(1)
将尝试阻塞 1 毫秒(但这是 OS 特定的,windows 将阻塞约 15 毫秒)并且线程仍然没有问题。
现在我认为您的 inputBuffer
有问题,因为它不是线程本地的。如果不止一个线程试图同时使用它,那将导致不一致。您可以尝试 Stream.Synchronized 或实现您自己的线程安全流 class.
我还建议您使用逐步调试或至少使用一些断点来了解发生了什么。