[英]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类不是线程安全的吗? 如果是这样,如何重写代码?
有任何想法吗?
谢谢!
从MSDN :
线程安全
此类型的任何公共静态成员都是线程安全的。 不保证任何实例成员都是线程安全的。
另外,我在您的代码中看不到任何线程敏感的调用/方法。 您正在实例化一个线程本地的Stopwatch
并使用它。 顺便说一句, Thread.Sleep(1)
将尝试阻塞Thread.Sleep(1)
毫秒(但这是特定于操作系统的,Windows会阻塞15毫秒),但是线程仍然没有问题。
现在我认为您的inputBuffer
存在问题,为什么,因为它不是线程局部的。 如果多个线程试图同时使用它,则将导致不一致。 您可以尝试Stream.Synchronized或实现自己的线程安全的流类。
我还建议您使用逐步调试或至少使用一些断点来了解发生了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.